All integers in the input and the output are non-negative and can be represented by 64-bit integral types.
#include<iostream> #include<algorithm> #include<cstdlib> #include<cstdio> #include<cstring> #define LL long long using namespace std; LL r[10005],m[10005];//a[0],m[0]不使用 LL n; void extendgcd(LL a,LL b,LL &d,LL &x,LL &y) { if(!b) { d=a; x=1; y=0; } else { extendgcd(b,a%b,d,y,x); y-=x*(a/b); } } LL extendcrt() { LL M=m[1],R=r[1]; for(int i=2;i<=n;i++) { LL x,y,d; extendgcd(M,m[i],d,x,y); if((r[i]-R)%d)//无解 return -1; x=((r[i]-R)/d*x%m[i]+m[i])%m[i];//x的最小正整数解 R+=x*M; M=M/d*m[i];//求(M,m[i])的最小公倍数 R%=M; } if(R<0) R+=M; return R; } int main() { while(cin>>n) { for(int i=1;i<=n;i++) cin>>m[i]>>r[i]; cout<<extendcrt()<<endl;//若有解,返回最小正整数解,否则返回-1 } return 0; }
全局变量: int r[10005],m[10005];//r[0],m[0]不使用 int n//式子的个数 int extendcrt()//返回方程组的最小非负整数解 { int M=m[1],R=r[1]; for(int i=2;i<=n;i++) { int x,y,d; extendgcd(M,m[i],d,x,y); if((r[i]-R)%d)//无解 return -1; x=((r[i]-R)/d*x%m[i]+m[i])%m[i];//x的最小正整数解 R+=x*M; M=M/d*m[i];//求(M,m[i])的最小公倍数 R%=M; } if(R<0) R+=M; return R; } int main() { 初始化n,m[],r[]; cout<<extendcrt()<<endl;//若有解,返回最小正整数解,否则返回-1 }