非互質の中国の残りの定理-HSU 1573

3474 ワード

https://vj.xtuacm.cf/contest/view.action?cid=86#problem/C互いに質的でない中国の残りの定理のテンプレート、いくつかの細部は中国の残りの定理の中でもし解がなければ-1の別のテーマの要求が正の整数であることに注意しなければならなくて、最後にいくつかの小さい技巧があります
#include
#include
#include
#define ll long long
using namespace std;
ll l;
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(!b) {d=a;x=1;y=0;}
    else{
        ex_gcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}
ll ex_crt(ll m[],ll r[],int n)
{
    ll M=m[1],R=r[1],x,y,d;
    for(int i=2;i<=n;i++){
        ex_gcd(M,m[i],d,x,y);
        if((r[i]-R)%d) return -1;//             -1
        x=(r[i]-R)/d*x%(m[i]/d);
        R+=x*M;
        M=M/d*m[i];
        R%=M;
    }
    l=M;
    return R<0?R+M:R;

}
int main()
{
    ll a[15],b[15];
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int x;
        int y;
        scanf("%d %d",&x,&y);
        for(int i=1;i<=y;i++)
            scanf("%I64d",&a[i]);
        for(int i=1;i<=y;i++)
            scanf("%I64d",&b[i]);
        ll s=ex_crt(a,b,y);
        if(s>x||s==-1)//  -1         
            cout<<0<if(s==x)
            cout<<1<if(sif(s>0)
                cout<1<if(s==0)    //0           
                cout<return 0;
}