hdu3575(中国剩余定理,注意特殊情况处理)

来源:互联网 发布:unity3d ios插件 编辑:程序博客网 时间:2024/05/29 17:39



#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define ll long long using namespace std;ll n,m[10009],a[10009];void exgcd(ll a,ll b,ll &d,ll &x,ll &y){if (b==0){d=a;x=1;y=0;return ;}exgcd(b,a%b,d,y,x);y-=x*(a/b);}ll gcd(ll a,ll b){return b? gcd(b,a%b):a;}int main(){int T;scanf("%d",&T);for (int i=1;i<=T;i++){ bool o=true;scanf("%lld",&n);for (int j=1;j<=n;j++) scanf("%lld",&m[j]);for (int j=1;j<=n;j++) scanf("%lld",&a[j]);for (int j=2;j<=n;j++){ll d,y,x;exgcd(m[j-1],m[j],d,x,y);if ((a[j]-a[j-1])%d) o=false;x*=(a[j]-a[j-1])/d;ll h=m[j]/d;x=(x%h+h)%h;a[j]=x*m[j-1]+a[j-1];m[j]=m[j-1]/d*m[j];a[j]=(a[j]%m[j]+m[j])%m[j];}if (a[n]==0)//如果余数都是0的话就按照这种情况{a[n]=1;for (int i=1;i<=n;i++) a[n]=a[n]*m[i]/gcd(m[i],a[n]);}if(o) printf("Case %d: %lld\n",i,a[n]);else printf("Case %d: -1\n",i);}return 0;}


0 0