HDU 3579 Hello Kiki(中国剩余定理不互质版本)
不理解,不明白啊,不互质的时候,思路是两个方程合并成一个,再合并,最后求出结果。。。这个博客讲的不错。
1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 #include <cmath> 5 using namespace std; 6 #define ll __int64 7 ll p[11],o[11]; 8 ll x,y; 9 ll ext_eulid(ll a,ll b) 10 { 11 ll t,d; 12 if(b == 0) 13 { 14 x = 1; 15 y = 0; 16 return a; 17 } 18 d = ext_eulid(b,a%b); 19 t = x; 20 x = y; 21 y = t - (a/b)*y; 22 return d; 23 } 24 ll gcd(ll a,ll b) 25 { 26 return b == 0?a:gcd(b,a%b); 27 } 28 int main() 29 { 30 int t,i,n,z,num = 0; 31 ll p1,o1,d,c,mod; 32 scanf("%d",&t); 33 while(t--) 34 { 35 scanf("%d",&n); 36 for(i = 1;i <= n;i ++) 37 scanf("%I64d",&p[i]); 38 for(i = 1;i <= n;i ++) 39 scanf("%I64d",&o[i]); 40 p1 = p[1];o1 = o[1]; 41 z = 1; 42 for(i = 2;i <= n&&z;i ++) 43 { 44 d = ext_eulid(p1,p[i]); 45 c = o[i] - o1; 46 if(c%d) z = 0;//无解的情况 47 mod = p[i]/d; 48 x = ((c/d*x)%mod+mod)%mod; 49 o1 = p1*x + o1; 50 p1 = p1*mod; 51 } 52 if(!z) 53 { 54 printf("Case %d: -1\n",++num); 55 continue; 56 } 57 if(o1 == 0)//这个题目需要特判 58 { 59 o1 = 1; 60 for(i = 1;i <= n;i ++) 61 o1 = o1*p[i]/gcd(o1,p[i]); 62 } 63 printf("Case %d: %I64d\n",++num,o1); 64 } 65 return 0; 66 }