poj1006:Biorhythms(中国剩余定理,扩展欧几里得)

来源:互联网 发布:淘宝全球购靠谱吗 编辑:程序博客网 时间:2024/05/22 19:27

传送门

题意:
给定四个数a,b,c,d。求满足
Ma(mod23),Mb(mod28),Mc(mod33),M>d
的最小正整数M。

题解:
又是一道板题。
M1=2328,M1x+33y=a.
同理求得M2,M3
M=M1x1+M2x2+M3x3
最小取个Mod就好了。

#include<cstdio>using namespace std;int A,B,C,bg;long long a,b,ans;inline void exgcd(int x,int y,long long &a,long long &b){    if(!y)    {        a=1;        b=0;        return;    }    exgcd(y,x%y,a,b);    long long a2=a;    a=b;    b=(a2-b*(x/y));}int main(){    while(scanf("%d%d%d%d",&A,&B,&C,&bg),A!=-1,B!=-1,C!=-1,bg!=-1)    {        static int tt=0;        ++tt;        ans=0;        exgcd(23*28,33,a,b);        a*=C;        a=(a%33+33)%33;        ans+=a*23*28;        exgcd(28*33,23,a,b);        a*=A        a=(a%23+23)%23;;        ans+=a*28*33;        exgcd(23*33,28,a,b);        a*=B;        a=(a%28+28)%28;        ans+=a*23*33;        ans%=21252;        if(bg>=ans)ans+=((bg-ans)/21252+1)*21252;        printf("Case %d: the next triple peak occurs in %lld days.\n",tt,ans-bg);    }}