HDOJ3579Hello Kiki

https://acm.hdu.edu.cn/showproblem.php?pid=3579

一些坑点。首先是如果说最后求得到的结果为0,那么在数学意义上这是正确的,0对于任何的确是最小的整数解,但实际意义正整数就并非如此了,如果为0,那么下一个最小解为最小公倍数。

一个技巧,先除再乘防止爆炸。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll ncases,n,x,y;
 5 const int N=52;
 6 ll m[N],r[N];
 7 ll ex_gcd(ll a,ll b,ll &x,ll &y)
 8 {
 9     if(!b) {x=1,y=0;return a;}
10     ll d=ex_gcd(b,a%b,x,y);
11     ll tmp=x;
12     x=y;y=tmp-a/b*y;
13     return d;
14 }
15 int main()
16 {
17     ll a,b,c,a1,b1,a2,b2,num=0;
18     scanf("%lld",&ncases);
19     while(ncases--)
20     { 
21         num++;
22         scanf("%lld",&n);
23         printf("Case %lld: ",num); 
24         for(int i=1;i<=n;i++) scanf("%lld",&m[i]);
25         for(int i=1;i<=n;i++) scanf("%lld",&r[i]);
26         a1=m[1],b1=r[1];
27         bool flag=true;
28         for(int i=2;i<=n;i++)
29         {
30             a2=m[i],b2=r[i];
31             a=a1,b=a2,c=b2-b1;
32             ll d=ex_gcd(a,b,x,y);
33             if(c%d){cout<<-1<<'\n';flag=false;break;}
34             ll t=b/d;
35             x=(x*(c/d)%t+t)%t;//先除防止爆炸 
36             b1=a1*x+b1;
37             a1=a1*(a2/d);    
38         }
39         if(flag) printf("%lld\n",(b1==0?a1:b1));
40     }
41     return 0;
42 }

 

上一篇:【Loj #10104. 「一本通 3.6 练习 5」Blockade】题解


下一篇:洛谷 B2004 对齐输出