HDU1573 X问题

来源:互联网 发布:租书软件 编辑:程序博客网 时间:2024/06/03 14:03

线性同余方程组

题目传送门

HDU前几天就好了,然而我却不知道QAQ

仍然是比较基础的解线性同余方程组,只不过多了一个范围。

lcm=[a1,a2,an],当x满足题意时,x+klcmn均为答案。于是我们只需要除一除就好啦!

代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;int t,m,n;int a[11],b[11];int exgcd(int a,int &x,int b,int &y){    if (!b) return x=1,y=0,a;    int r=exgcd(b,y,a%b,x);    return y-=x*a/b,r;}int main(){    scanf("%d",&t);    while (t--){        scanf("%d%d",&n,&m);        int lcm=1,xx,yy;        for (int i=1;i<=m;i++) scanf("%d",&a[i]),lcm=lcm/exgcd(lcm,xx,a[i],yy)*a[i];        for (int i=1;i<=m;i++) scanf("%d",&b[i]);        int a1=a[1],m1=b[1];        bool f=false;        for (int i=2;i<=m;i++){            int a2=a[i],m2=b[i],x,y;            int r=exgcd(a1,x,a2,y);            if ((m2-m1)%r){ f=true; break; }            LL t=a2/r;            x=((x*(m2-m1)/r)%t+t)%t;            m1+=a1*x; a1*=t;        }        int ans=0;        if (m1<=n)             ans=1+(n-m1)/lcm;        if (ans&&m1==0) ans--;        if (f) printf("0\n");        else printf("%d\n",ans);    }    return 0;}