这题和poj 2891类似 可以用扩展gcd解之
因为循环求出的解中 b1为所求的最小解 而a1巧好为 a【i】数组的lcm
我们知道要使得一个数满足题意要求那么这个数满足 b1(求出的最小解)+lcm*t<=n
这样t就是我们所要求的 注意特判b1为0的情况b
ACcode:
#include <bits/stdc++.h>
#define maxn 100
#define ll long long
using namespace std;
ll A[maxn],B[maxn];
ll gcd(ll a, ll b){return b?gcd(b,a%b):a;}
ll ex_gcd(ll a,ll b, ll &x,ll &y){
if(a==0&&b==0)return -1;
if(b==0){x=1,y=0;return a;}
ll d=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
int loop;
ll n,m,lcm,x,y,a1,a2,b1,b2,a,b,d,c;
scanf("%d",&loop);
while(loop--){
cin>>n>>m;
for(int i=1;i<=m;++i)cin>>A[i];
for(int i=1;i<=m;++i)cin>>B[i];
a1=A[1],b1=B[1];
bool flag=true;
for(int i=2;i<=m;++i){
a2=A[i],b2=B[i];
a=a1,b=a2,c=b2-b1;
d=ex_gcd(a,b,x,y);
if(c%d){
flag=false;
continue;
}
ll t=b/d;
x=(x*(c/d)%t+t)%t;
b1=a1*x+b1;
a1=a1*(a2/d);///a1= lcm(a1,a2)
}
if(!flag||b1>n)puts("0");
else printf("%I64d\n",(n-b1)/a1+1-(b1==0?1:0));
}
return 0;
}