中国剩余定理--不互质情况

来源:互联网 发布:知乎周刊plus我,一个人 编辑:程序博客网 时间:2024/06/04 20:11

传送门:HDU.1573

#include<iostream>#include<cstdio>#include<cstring>#define LL long longusing namespace std;const int maxn=100;LL extend_gcd(LL a,LL b,LL &x,LL &y);int main(){    //freopen("in.txt","r",stdin);    int t;    cin>>t;    while(t--){        LL n,mm,i,a[maxn],m[maxn];        cin>>n>>mm;        for(i=1;i<=mm;i++)           cin>>m[i];        for(i=1;i<=mm;i++)           cin>>a[i];        LL x,y,a1=a[1],m1=m[1],flag=0;        for(i=2;i<=mm;i++){//方程组合并为一个方程            LL a2=a[i],m2=m[i];            LL gcd=extend_gcd(m1,m2,x,y);            if((a2-a1)%gcd){//有解条件                flag=1;                break;            }            x*=(a2-a1)/gcd;            if(x<=0)x+=m2;//求出最小的大于0的x            a1+=m1*x;            m1=m1*m2/gcd;            a1=(a1%m1+m1)%m1;        }        if(a1>n||flag)cout<<0<<endl;        else{            LL k;            for(k=0;k*m1+a1<=n;k++);            if(a1==0)k--;                cout<<k<<endl;            //cout<<(n-a1)/m1+1-(!a1?1:0)<<endl;        }    }}LL extend_gcd(LL a,LL b,LL &x,LL &y){    if(b==0){        x=1;        y=0;        return a;    }    LL d=extend_gcd(b,a%b,y,x);    y=y-a/b*x;    return d;}


原创粉丝点击