poj1006

链接:点击打开链接

题意:求同余方程组X≡p(mod 23),X≡e(mod 28),X≡i(mod 33)求大于d的最小整数解

代码:

#include <stdio.h>
#include <iostream>
using namespace std;
void exgcd(int a,int b,int &d,int &x,int &y){
    if(!b)
    x=1,y=1,d=a;
    else{
        exgcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}
int a[5],m[5],M;
int china(int r){
    int i,x,y,d,ans,tmp;
    ans=0;
    for(i=1;i<=r;i++)
    M*=m[i];
    for(i=1;i<=r;i++){
        tmp=M/m[i];
        exgcd(tmp,m[i],d,x,y);
        ans=(ans+tmp*a[i]*x)%M;
    }
    if(ans<0)
    ans+=M;
    return ans;
}                                               //中国剩余定理模板
int main(){
    int i,j,d,cas,ans;
    cas=1;
    while(scanf("%d%d%d%d",&a[1],&a[2],&a[3],&d)!=EOF){
        if(a[1]==-1&&a[2]==-1&&a[3]==-1&&d==-1)
        break;
        M=1,m[1]=23,m[2]=28,m[3]=33;
        ans=china(3);
        while(ans<=d)
        ans+=M;
        printf("Case %d: the next triple peak occurs in %d days.\n",cas++,ans-d);
    }
    return 0;
}


 

你可能感兴趣的:(poj1006)