和hdu 1573基本一样。注意不能输出0,是最小正整数解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110, INF = 0x3f3f3f3f;
int M[N], R[N];
int gcd(int a, int b)
{
return !b ? a : gcd(b, a%b);
}
int extgcd(int a, int b, int &x, int &y)
{
int d = a;
if(b)
{
d = extgcd(b, a%b, y, x);
y -= (a/b) * x;
}
else x = 1, y = 0;
return d;
}
int linear_congruence(int M[], int R[], int n)
{
int m = M[1], r = R[1];
int x, y, flag = 1;
for(int i = 2; i <= n; i++)
{
int d = gcd(m, M[i]), c = R[i] - r;
if(c % d != 0)
{
flag = 0;
break;
}
extgcd(m/d, M[i]/d, x, y);
int tm = M[i] / d;
x = ((c/d * x) % tm + tm) % tm;
r = r + x*m;
m = m/d * M[i];
r %= m;
}
if(flag) return r?r:r+m;
else return -1;
}
int LCM(int a, int b)
{
return a/__gcd(a,b)*b;
}
int main()
{
int t, m, cnt = 0, zcnt;
scanf("%d", &t);
while(t--)
{
zcnt = 0;
scanf("%d", &m);
printf("Case %d: ",++cnt);
for(int i = 1; i <= m; i++)
scanf("%d", &M[i]);
for(int i = 1; i <= m; i++)
scanf("%d", &R[i]);
printf("%d\n",linear_congruence(M, R, m));
}
return 0;
}