题解:中国剩余定理
通解:ans=a[i]*M[i]*Inv(M[i],m[i])+k*M
注意window与linux下读入输出差异
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long Lint; int T; Lint b; Lint m[4]={0,23,28,33}; Lint a[4]; Lint M; Lint ans; Lint Gcd(Lint a,Lint b){ if(b==0)return a; return Gcd(b,a%b); } Lint Inv(Lint x,Lint p){ int k=0; for(int i=1;i<=p;++i)if(Gcd(i,p)==1)++k; Lint ret=1; k--; for(;k;k>>=1,x=x*x%p){ if(k&1)ret=ret*x%p; } return ret; } int main(){ M=m[1]*m[2]*m[3]; while(scanf("%lld%lld%lld%lld",&a[1],&a[2],&a[3],&b)){ ++T; if(a[1]==-1)return 0; ans=0; for(int i=1;i<=3;++i){ ans=(ans+a[i]*(M/m[i])*Inv(M/m[i],m[i]))%M; } ans=(ans-b+M)%M; if(ans==0)ans=M; printf("Case %d: the next triple peak occurs in %lld days.\n",T,ans); } }