http://acm.hdu.edu.cn/showproblem.php?pid=1788
Problem Description
2 1 2 3 0 0
5
分析:即求出Mi的最小公倍数最后减a即可。
#include <iostream> #include <cstdio> using namespace std; typedef long long LL; LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } LL m[12]; int main() { int I; LL a; while(cin>>I>>a&&(I+a)){ for(int i=0;i<I;i++){ scanf("%I64d",&m[i]); } LL g=m[0]; for(int i=1;i<I;i++){ g=g/gcd(g,m[i])*m[i]; } printf("%I64d\n",g-a); } return 0; }
然而,我不知道为什么直接中国剩余定理解 就不对。。
WA:
#include <iostream> #include <cstdio> using namespace std; typedef long long LL; LL m[15],a; void exgcd(LL a,LL b,LL &d,LL &x,LL &y){ if(b==0){ x=1; y=0; d=a; return ; } exgcd(b,a%b,d,x,y); int temp=x; x=y; y=temp-(a/b)*y; } LL M; LL China(int r){ M=1; LL Mi,x0,y0,d,ans=0; for(int i=0;i<r;i++) M=M*m[i]; for(int i=0;i<r;i++){ Mi=M/m[i]; exgcd(Mi,m[i],d,x0,y0); ans=(ans+Mi*x0*(m[i]-a))%M; } if(ans<0) ans+=M; return ans; } int main() { int I; while(cin>>I>>a&&(I+a)){ for(int i=0;i<I;i++) scanf("%lld",&m[i]); LL ans=China(I); //if(ans<=a) ans+=a; printf("%lld\n",ans); } return 0; }