SYCOJ798Biorhythms
https://oj.shiyancang.cn/Problem/798.html
#includeusing namespace std; typedef long long ll; const int mod = 21252; ll a[4],m[4]; ll M; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(b==0){x=1,y=0;return a;} ll d=ex_gcd(b,a%b,x,y); ll temp=x;x=y;y=temp-a/b*y; return d; } ll crt(ll n) { ll i,Mi,xi,yi,d,Ans=0; M=1; for(i=1;i<=n;i++)M*=m[i]; for(i=1;i<=n;i++) { Mi=M/m[i];d=ex_gcd(Mi,m[i],xi,yi); Ans=(Ans+Mi*a[i]*xi)%M; } return (Ans%M+M)%M;//最小整数解,因为gcd为1所以直接M就可以了 } int main() { ll k,t=0; m[1]=23,m[2]=28,m[3]=33; while(~scanf("%lld%lld%lld%lld",&a[1],&a[2],&a[3],&k),a[1]!=-1||a[2]!=-1||a[3]!=-1||k!=-1) { ll ans=crt(3); while(ans<=k) ans+=M;//要超过k才行 printf("Case %lld: the next triple peak occurs in ",++t); cout< " days.\n"; } return 0; }
特殊情况的中国剩余定理,直接构造,因为gcd为1,并且在模M下具有唯一解,所以正常的模M就可以了。
但是要大于k,所以要到k之后。