题意:对于方程组x=a(mod b)求x。
做法:中国剩余定理和拓展欧几里得。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long int64;
int64 gcd(int64 a, int64 b){
return (b == 0)? a: gcd(b, a % b);
}
int64 gcd_ex(int64 a, int64 b,int64& x,int64&y)
{
if (b==0) {x=1;y=0;return a;}
int64 d=gcd_ex(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
int64 T,a[10],b[10],num=1;
scanf("%I64d",&T);
while(T--)
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%I64d",&b[i]);
for(i=0;i<n;i++)
scanf("%I64d",&a[i]);
int flag=0;
int64 b1,b2,m1,m2,k1,k2;
b1=a[0],m1=b[0];
for(i=1;i<n;i++)
{
b2=a[i],m2=b[i];
int64 g=gcd_ex(m1,m2,k1,k2);
if((b2-b1)%g!=0) {flag=1;break;}
k1=(k1*((b2-b1)/g)%(m2/g)+(m2/g))%(m2/g);
b1=m1*k1+b1;m1=(m1*m2/g);
}
if(flag==1)
printf("Case %I64d: -1\n",num++);
else
printf("Case %I64d: %I64d\n",num++,b1?b1%m1:m1);
}
return 0;
}