标签:ncases int ll long HDOJ3579Hello num Kiki lld
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 }
标签:ncases,int,ll,long,HDOJ3579Hello,num,Kiki,lld 来源: https://www.cnblogs.com/Astronaut0142/p/15084095.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。