您的位置:首页 > 其它

hdu 1573 X问题 非互素的中国剩余定理应用

2013-07-10 01:23 281 查看
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1573
注意要点:

1 最后的次数直接用除法 取高斯加1即可 若用加法累加会超时

2 很容易漏掉的一点是题目要求正整数个数, 不是非负整数 ,如果最后r1==0 而且结果不是0 ,就要在结果上减一

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long inta;

void extend_gcd(inta a,inta b,inta &x,inta &y,inta &gcd)
{
if(b==0)
{
x=1;
y=0;
gcd=a;
}
else
{
extend_gcd(b,a%b,x,y,gcd);
inta temp=x;
x=y;
y=temp-a/b*y;

}
}
int main()
{

int  size=0;
cin>>size;
for(int k=0;k<size;k++)
{
int bad=0;
inta n,m;
cin>>n>>m;
int *a=new int[m];
int *r=new int[m];
for(int i=0;i<m;i++)
cin>>a[i];
for(int i=0;i<m;i++)
cin>>r[i];

inta a1,r1,a2,r2,x,y;
a1=a[0];
r1=r[0];
for(int i=1;i<m;i++)
{
a2=a[i];
r2=r[i];
inta a=a1;
inta b=a2;
inta c=r2-r1;
inta q=1;
extend_gcd(a,b,x,y,q);
if(c%q!=0)
{
bad=1;
break;    // 和poj那个题不一样 后面可以直接不管了
}

else
{
inta t=b/q;
x=(c/q*x%t+t)%t;
r1=a1*x+r1;
a1=a1/q*a2;
r1=r1%a1;
}
}

if(bad==1)
cout<<0<<endl;
else
{

inta ans= 0;
if(n>=r1)
ans=(n-r1)/a1+1;
if(ans>0&&r1==0)
ans-=1;  //只要正整数
cout<<ans<<endl;

}

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