中国剩余定理什么的。。。(若干年前用暴力随手A过)
x=ai(mod mi) 求x 其中mi与mj互质
令M=prod/mi,Mi=M/mi,
由于gcd(Mi,mi)=1,而有p,q满足p*Mi+q*mi=gcd(Mi,mi),
故p*Mi+q*mi=1,
则p*Mi=1 (mod mi),ai*p*Mi=ai (mod mi)
令x=sum( ai*p*Mi ),则x=ai (mod mi),
因为aj*pj*Mj=0 (mod mi) 因为mi|Mj。
所以x满足所有x=ai(mod mi)。
这道题就是求x使得
(x-a1)%m1=0
(x-a2)%m2=0
(x-a3)%m3=0
化简就是
x-a1=m1*k
x=m1*k+a1
x=a1 (mod m1)
然后求就行了。。。
#include<stdio.h> int m[5]={23,28,33}; int a[5]; int e_gcd(int a,int b,int &x,int &y){ if(b==0){x=1,y=0;return a;} else{ int r=e_gcd(b,a%b,y,x); y-=x*(a/b); return r; } } int crt(int a[],int m[],int n){ int i,x,y,tmp,M=1,as=0; for(i=0;i<n;i++)M*=m[i]; for(i=0;i<n;i++){ tmp=M/m[i]; e_gcd(tmp,m[i],x,y); as=(as+tmp*a[i]*x)%M; } return (as+M)%M; } int main(){ int x,y,cs=1; while(~scanf("%d%d%d%d",&a[0],&a[1],&a[2],&y)){ if(a[0]<0)break; x=crt(a,m,3); x=(x-y+21252)%21252; printf("Case %d: the next triple peak occurs in %d days.\n",cs++,x==0?21252:x); } return 0; }