POJ 1006 Biorhythms 中国剩余定理

第一道中国剩余定理

代码来源于HIT《数论及应用》

#include <cstdio>
using namespace std;
int m[4],a[4],M;
void Ext_Gcd(int a,int b,int &d,int &x,int &y)
{
    if(!b){
        x=1;y=0;d=a;
        return ;
    }
    else
    {
        Ext_Gcd(b,a%b,d,y,x);
        y-=a/b*x;
    }
}
int China(int r)
{
    M=1;
    int i,Mi,x0,y0,d,ans=0;
    for(int i=1;i<=r;i++)
        M*=m[i];
    for(int i=1;i<=r;i++){
        Mi=M/m[i];
        Ext_Gcd(Mi,m[i],d,x0,y0);
        ans=(ans+Mi*x0*a[i])%M;
    }
    if(ans<0)
        ans+=M;
    return ans;
}
int main()
{
    int Case=0;
    int p,e,i,d;
    while(~scanf("%d%d%d%d",&p,&e,&i,&d)&&p!=-1&&e!=-1&&i!=-1&&d!=-1){
            a[1]=p;a[2]=e;a[3]=i;
            m[1]=23;m[2]=28;m[3]=33;
            int ans=China(3);
            while(ans<=d)
                ans+=M;
            printf("Case %d: the next triple peak occurs in %d days.\n",++Case,ans-d);
    }
    return 0;
}


你可能感兴趣的:(POJ 1006 Biorhythms 中国剩余定理)