线性同余方程组
HDU前几天就好了,然而我却不知道QAQ
仍然是比较基础的解线性同余方程组,只不过多了一个范围。
设 lcm=[a1,a2…,an] ,当x满足题意时, x+k∗lcm≤n 均为答案。于是我们只需要除一除就好啦!
代码:
#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;
}