hdu 2891 中国剩余定理
从6点看到10点,硬是没算出来,早知道玩游戏去了,艹,明天继续看
不爽,起来再看,终于算是弄懂了,以后超过一个小时的题不会再看了,不是题目看不懂,是水平不够
1 #include<cstdio> 2 using namespace std; 3 __int64 result,d; 4 int flag; 5 __int64 gcd(__int64 a,__int64 b,__int64 &x,__int64 &y) 6 { 7 __int64 t,ret; 8 if(!b) 9 { 10 x = 1; 11 y = 0; 12 return a; 13 } 14 ret=gcd(b,a%b,x,y); 15 t=x; 16 x=y; 17 y=t-a/b*y; 18 return ret; 19 } 20 void fun(__int64 a,__int64 b,__int64 n) 21 { 22 __int64 x,y; 23 d=gcd(a,n,x,y); 24 if(b%d!=0) 25 flag =1; 26 result=(x*(b/d)%n+n)%n; 27 } 28 int main() 29 { 30 31 __int64 a1,m1,a2,m2,t; 32 while(scanf("%I64d",&t)!=EOF) 33 { 34 scanf("%I64d %I64d",&m1,&a1); 35 t--; 36 flag=0; 37 while(t--) 38 { 39 scanf("%I64d %I64d",&m2,&a2); 40 fun(m1,a2-a1,m2); 41 a1+=m1*result; 42 m1=m1*m2/d; 43 a1=(a1%m1+m1)%m1; 44 } 45 if(flag) 46 printf("-1\n"); 47 else 48 printf("%I64d\n",a1); 49 } 50 return 0; 51 }