您的位置:首页 > 其它

hdu1573中国剩余问题定理模数非互质的的情况

2012-08-02 10:23 267 查看
依旧没弄懂。。先会用模版再说。。

注意讨论(ans==-1)的情况

#include<iostream>
#define llint long long int
using namespace std;
const int MAXM=12;

llint exgcd(llint a, llint b, llint &x, llint &y)
{
if(b == 0){ x = 1, y = 0; return a;}
llint r = exgcd(b, a % b, x, y);
llint tmp = x;    x = y;  y = tmp - a/b * y;
return r;
}
long long int lcm(long long int a,long long int b)
{
llint x,y;
return (a*b)/(exgcd(a,b,x,y));
}
llint crr(llint mm[],llint rr[],llint n)
{
llint m1=mm[0];
llint r1=rr[0];
llint i;
bool flag;
for ( i = 0; i < n - 1; i++)
{
llint m2=mm[i+1];
llint r2=rr[i+1];
if (flag)
continue;
llint x,y;
llint d = exgcd(m1,m2,x,y);
llint c = r2 - r1;
if (c % d)
{
flag = 1;
continue;
}
llint t=m2/d;
x=(c/d*x%t+t)%t;
r1=m1*x+r1;
m1=m1*m2/d;
}
if(!flag)
{
if (r1==0&&n>1)
{
r1=mm[0];
__int64 ans=1;
llint x,y;
for (i=1;i<n;i++)
{
r1=exgcd(mm[i],r1,x,y);
}
for ( i=0;i<n;i++)
{
ans*=mm[i];
}
r1=ans/r1;
}
if (r1==0&&n==1)
r1=mm[0];
return r1;
}else
{
return -1;
}
}

int main()
{
llint T;
cin>>T;
while(T--)
{
llint N,M;
llint a[MAXM],b[MAXM];
cin>>N>>M;
llint i;
llint mt=1;
for(i=0;i<=M-1;i++)
{
cin>>a[i];
mt=lcm(mt,a[i]);
}
for(i=0;i<=M-1;i++)
{
cin>>b[i];
}

llint ans=crr(a,b,M);
//     cout<<ans<<"|"<<mt<<endl;
if(ans==-1)
{
cout<<0<<endl;
continue;
}
if(ans<N)
{
cout<<(N-ans)/mt+1<<endl;
}else
{
cout<<0<<endl;
}
//cout<<(N-ans)/mt<<endl;
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: