poj1006---中国剩余定理

#include<iostream>
using namespace std;

int main(){
    int p,e,i,d,count=0;
    while(cin>>p>>e>>i>>d,p!=-1&&e!=-1&&i!=-1&&d!=-1){
        count++;
        int n=(1288*i+14421*e+5544*p-d+21252)%21252;
        if(n==0)
        cout<<"Case "<<count<<": the next triple peak occurs in "<<"21252"<<" days."<<endl;
        else
        cout<<"Case "<<count<<": the next triple peak occurs in "<<n<<" days."<<endl;
    }
    return 0;
}

中国剩余定理的应用(运用的要求是n%m=r,其中m必须两两互质)

下面我们来看一个例子:

韩信点兵问题:已知n%3=2,n%5=3,n%7=2,求n.

设x=n%3,y=n%5,z=n%7且3,5,7互质。

使5×7×a(5,7为3之外的剩余两个数)被3除余1,有35×2=70,即a=2;  使3×7×b(3,7为5之外的剩余两个数)被5除余1,用21×1=21,即b=1;  使3×5×c(5,3为7之外的剩余两个数)被7除余1,用15×1=15,即c=1。

(其中的,为什么要余1,我们需上百度查阅中国剩余定理的证明)

那么n =(70×x+21×y+15×z)%lcm(3,5,7) = 23 这是n的最小解

而韩信已知士兵人数在2300~2400之间,所以只需要n+i×lcm(3,5,7)就得到了2333,此时i=22

同理我们便可解这个问题,

已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i         

使33×28×a被23除余1,用33×28×8=5544;        

 使23×33×b被28除余1,用23×33×19=14421;         

使23×28×c被33除余1,用23×28×2=1288。        

因此有(5544×p+14421×e+1288×i)% lcm(23,28,33) =n+d 

又23、28、33互质,即lcm(23,28,33)= 21252;       

所以有n=(5544×p+14421×e+1288×i-d)%21252

本题所求的是最小整数解,避免n为负,因此最后结果为n= [n+21252]% 21252 那么最终求解n的表达式就是:

n=(5544*p+14421*e+1288*i-d+21252)%21252;

问题得解;

原文地址:https://www.cnblogs.com/tz346125264/p/4860919.html