poj 1006中国剩余定理模板
中国剩余定理(CRT)的表述如下
设正整数两两互素,则同余方程组
有整数解。并且在模下的解是唯一的,解为
其中,而为模的逆元。
模板:
int crt(int a[],int m[],int n) { int e=0; int mod=1; for(int i=1; i<=n; i++) mod*=m[i]; for(int i=1; i<=n; i++) { int temp=mod/m[i]; e=(e+a[i]*temp*inv(temp,m[i]))%mod; // 这里求逆元 是对mi求,, } return e; }
poj 1006ac代码:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int mod; int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int temp=exgcd(b,a%b,y,x); y-=(a/b)*x; return temp; } int inv(int a,int b) { int x,y; int temp=exgcd(a,b,x,y); if(x<0) x+=b/temp; return x; } int crt(int a[],int m[],int n) { int e=0; int mod=1; for(int i=1; i<=n; i++) mod*=m[i]; for(int i=1; i<=n; i++) { int temp=mod/m[i]; e=(e+a[i]*temp*inv(temp,m[i]))%mod; // 这里求逆元 是对mi求,, } return e; } int main() { int a[4],m[4]; m[1]=23; m[2]=28; m[3]=33; int s; int Case=0; while(cin>>a[1]>>a[2]>>a[3]>>s) { if(a[1]==-1 && a[2]==-1 && a[3]==-1 && s==-1) break; int e=0; Case++; e=crt(a,m,3); if(e <= s) e+=21252; printf("Case %d: the next triple peak occurs in %d days.\n",Case,e-s); } return 0; }