中国剩余定理模数互质的情况模板(poj1006

http://poj.org/problem?id=1006

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#define inf 2147483647
#define N 1000010
#define p(a) putchar(a)
#define For(i,a,b) for(long long i=a;i<=b;++i)
//by war
//2019.8.8
using namespace std;
long long p,e,i,d,ans,m,x,y,cnt;
long long a[10],b[10];
void in(long long &x){
    long long y=1;char c=getchar();x=0;
    while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
    while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    x*=y;
}
void o(long long x){
    if(x<0){p('-');x=-x;}
    if(x>9)o(x/10);
    p(x%10+'0');
}

void exgcd(long long a,long long b,long long &x,long long &y){
    if(!b){
        x=1;y=0;
        return ;
    }
    exgcd(b,a%b,y,x);
    y-=a/b*x;
}

signed main(){
    a[1]=23;a[2]=28;a[3]=33;
    a[0]=a[1]*a[2]*a[3];
    while(cin>>b[1]>>b[2]>>b[3]>>d&&(b[1]!=-1)){
        ans=0;
        For(i,1,3){
            m=a[0]/a[i];
            exgcd(m,a[i],x,y);
            x=(x%a[i]+a[i])%a[i];
            ans=(ans+b[i]*m*x)%a[0];
        }
        ans=((ans-d)%a[0]+a[0])%a[0];
        if(ans==0)
            ans=a[0];
        cout<<"Case "<<++cnt<<": the next triple peak occurs in "<<ans<<" days."<<endl;
    }
    return 0;
}

 

上一篇:【BZOJ2759】—一个动态树好题(LCT+Exgcd)


下一篇:洛谷P5520 青原樱(组合数学)