您的位置:首页 > 其它

HDU1573X问题 解同余方程组问题

2017-07-15 13:48 183 查看
题意:问是否存在x属于(0,n]满足 x%ai=bi.ai,bi均为数组中的元素,长度为m。

思路:又是一道两个不互质的解模线性方程思路与这道类似:http://blog.csdn.net/chen_minghui/article/details/75137215

这道是加强版。要求给定范围内解的个数。上面的那道只需要求最小解。

#include<cstdio>
using namespace std;
const int maxn = 20;
int a[maxn],b[maxn];
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(!b)
{
d=a;
x=1;y=0;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main()
{
int t;
// freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);//x=b mod (a) => a1*x+b1 = a2 *y+b2
int d,x,y;
int f=1;
for(int i=0;i<m-1;i++)
{
exgcd(a[i],a[i+1],d,x,y);
int c=b[i+1]-b[i];
if(c%d)
{
f=0;
break;
}
else
{
int t=a[i+1]/d;
if(t<0)t=-t;
x*=c/d;
x=(x%t+t)%t;
b[i+1]=a[i]*x+b[i];//m的一个特解
a[i+1]=a[i]*(a[i+1]/d);//lcm
}
}
if(f==0)
{
printf("0\n");
continue;
}
int ans=0;
if(b[m-1]<=n)
ans=1+(n-b[m-1])/a[m-1];
if(ans&&b[m-1]==0)ans-=1;
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: