Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3107 Accepted Submission(s):
1157
1 /*看了题解,才知道数据中有只有一组数据,并且整除的数据 2 if(n==1&&a[1]==0) 3 { 4 printf("Case %d: %d\n",opt,m[1]); 5 continue; 6 }只有一组数据,并且还整除,中国剩余定理是解决不了的,要特判。 7 */ 8 #include<iostream> 9 using namespace std; 10 #include<cstdio> 11 #define inf (1<<31)-1 12 #define N 10 13 void exgcd(int a,int b,int &x,int &y,int &gcd) 14 { 15 if(b==0) 16 { 17 x=1;y=0; 18 gcd=a; 19 return ; 20 } 21 exgcd(b,a%b,x,y,gcd); 22 int t=x; 23 x=y; 24 y=t-(a/b)*y; 25 } 26 int main() 27 { 28 int T; 29 scanf("%d",&T); 30 int opt=0; 31 while(T--) 32 { 33 ++opt; 34 int n,m[N]={0},a[N]={0}; 35 int m1,m2,a1,a2,x,y,gcd; 36 scanf("%d",&n); 37 for(int i=1;i<=n;++i) 38 scanf("%d",&m[i]); 39 for(int i=1;i<=n;++i) 40 scanf("%d",&a[i]); 41 m1=m[1];a1=a[1]; 42 if(n==1&&a[1]==0) 43 { 44 printf("Case %d: %d\n",opt,m[1]); 45 continue; 46 } 47 bool flag=false; 48 for(int i=2;i<=n;++i) 49 { 50 a2=a[i];m2=m[i]; 51 exgcd(m1,m2,x,y,gcd); 52 if((a2-a1)%gcd) 53 { 54 flag=true; 55 break; 56 } 57 int t=m2/gcd; 58 x=(x*(a2-a1))/gcd; 59 x=(x%t+t)%t; 60 a1=m1*x+a1; 61 m1=(m1*m2)/gcd; 62 a1=(a1%m1+m1)%m1; 63 } 64 if(flag) 65 printf("Case %d: -1\n",opt); 66 else printf("Case %d: %d\n",opt,a1); 67 } 68 return 0; 69 }
原文:http://www.cnblogs.com/c1299401227/p/5514206.html