您的位置:首页 > 其它

不互质的中国剩余定理-HDU1573

2017-07-26 18:57 417 查看
https://vj.xtuacm.cf/contest/view.action?cid=86#problem/C

不互质的中国剩余定理模板,有些细节需要注意

在中国剩余定理中如果没有解会返回-1

另外题目要求是正整数,最后有一些小技巧

#include<iostream>
#include<cstdio>
#include<cstring>
#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<<endl;
if(s==x)
cout<<1<<endl;
if(s<x)
{
if(s>0)
cout<<(x-s)/l+1<<endl;
if(s==0)    //0是满足同余的第一个数时
cout<<x/l<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: