#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;
问题得解;
时间: 2024-10-09 04:39:29