题解 中国剩余定理(同余方程组) HDU 3579
题意:对于方程组x=a(mod b)求x。
做法:中国剩余定理和拓展欧几里得。
代码:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; typedef long long int64; int64 gcd(int64 a, int64 b){ return (b == 0)? a: gcd(b, a % b); } int64 gcd_ex(int64 a, int64 b,int64& x,int64&y) { if (b==0) {x=1;y=0;return a;} int64 d=gcd_ex(b,a%b,y,x); y-=a/b*x; return d; } int main() { int64 T,a[10],b[10],num=1; scanf("%I64d",&T); while(T--) { int n,i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%I64d",&b[i]); for(i=0;i<n;i++) scanf("%I64d",&a[i]); int flag=0; int64 b1,b2,m1,m2,k1,k2; b1=a[0],m1=b[0]; for(i=1;i<n;i++) { b2=a[i],m2=b[i]; int64 g=gcd_ex(m1,m2,k1,k2); if((b2-b1)%g!=0) {flag=1;break;} k1=(k1*((b2-b1)/g)%(m2/g)+(m2/g))%(m2/g); b1=m1*k1+b1;m1=(m1*m2/g); } if(flag==1) printf("Case %I64d: -1\n",num++); else printf("Case %I64d: %I64d\n",num++,b1?b1%m1:m1); } return 0; }