1. 程式人生 > 實用技巧 >HIT暑期集訓 數論

HIT暑期集訓 數論

中國剩餘定理,求解符合若干個x%a[i]≡b[i]的答案x(模板中求出的最小的非負整數解)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[3],b[3]={23,28,33};
void exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    { 
        x=1;y=0; 
        return;
    }
    exgcd(b,a%b,x,y);
    
int tmp=x; x=y; y=tmp-a/b*y; } int crt(int n) { int i,tmp,ans=0,lcm=1,x,y; for (i=0;i<n;++i) lcm*=b[i]; for (i=0;i<n;++i) { tmp=lcm/b[i]; exgcd(tmp,b[i],x,y); x=(x%b[i]+b[i])%b[i]; ans=(ans+tmp*x*a[i])%lcm; } return (ans+lcm)%lcm; } int
main() { int p,e,i,d; int cnt=0,ans; while (scanf("%d%d%d%d",&p,&e,&i,&d)!=EOF) { if (p==-1) break; a[0]=p; a[1]=e; a[2]=i; ans=crt(3); if (ans<=d) ans+=21252; cnt++; printf("Case %d: the next triple peak occurs in %d days.\n
",cnt,ans-d); } return 0; }
中國剩餘定理,模板題 POJ 1006