hdu 1573 X问题 非互素的中国剩余定理应用
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1573
注意要点:
1 最后的次数直接用除法 取高斯加1即可 若用加法累加会超时
2 很容易漏掉的一点是题目要求正整数个数, 不是非负整数 ,如果最后r1==0 而且结果不是0 ,就要在结果上减一
#include<iostream> #include<cstdio> using namespace std; typedef long long inta; void extend_gcd(inta a,inta b,inta &x,inta &y,inta &gcd) { if(b==0) { x=1; y=0; gcd=a; } else { extend_gcd(b,a%b,x,y,gcd); inta temp=x; x=y; y=temp-a/b*y; } } int main() { int size=0; cin>>size; for(int k=0;k<size;k++) { int bad=0; inta n,m; cin>>n>>m; int *a=new int[m]; int *r=new int[m]; for(int i=0;i<m;i++) cin>>a[i]; for(int i=0;i<m;i++) cin>>r[i]; inta a1,r1,a2,r2,x,y; a1=a[0]; r1=r[0]; for(int i=1;i<m;i++) { a2=a[i]; r2=r[i]; inta a=a1; inta b=a2; inta c=r2-r1; inta q=1; extend_gcd(a,b,x,y,q); if(c%q!=0) { bad=1; break; // 和poj那个题不一样 后面可以直接不管了 } else { inta t=b/q; x=(c/q*x%t+t)%t; r1=a1*x+r1; a1=a1/q*a2; r1=r1%a1; } } if(bad==1) cout<<0<<endl; else { inta ans= 0; if(n>=r1) ans=(n-r1)/a1+1; if(ans>0&&r1==0) ans-=1; //只要正整数 cout<<ans<<endl; } } }