题意:
给
n
个
(a[i]不互质)。
题解:
中国剩余定理。
考虑两个方程的合并:
X≡b1(moda1)X≡b2(moda2)
⇒X=b1+k1a1,X=b2+k2a2
⇒b1+k1a1=b2+k2a2
考虑用扩欧解出一个
k1
的特解
k0
(若没有则无解),得到。
k1=k0+lcm(a1,a2)
⇒X=(k0+lcm(a1,a2))∗a1+b1
则 X≡k0a1+b1(modlcm(a,1,a2))
把所有方程都合并起来就好了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
char ch=getchar();ll i=0,f=1;
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){i=(i<<1)+(i<<3)+ch-'0';ch=getchar();}
return i*f;
}
int n;
ll ans,m,A[15],B[15],a,b,res;
bool id[15];
inline long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}
inline void exgcd(long long x,long long y,long long &a,long long &b)
{
if(!y)
{
a=1;
b=0;
return;
}
exgcd(y,x%y,a,b);
long long a2=a;
a=b;
b=(a2-b*(x/y));
}
inline bool merge(int x,int y)
{
long long t=gcd(A[x],A[y]),t2=B[y]-B[x];
if(t2%t)return false;
t2/=t;
exgcd(A[x]/t,A[y]/t,a,b);
a=(a*t2%(A[y]/t)+A[y]/t)%(A[y]/t);
long long x0=a*A[x]+B[x];
t2=A[x]*A[y]/t;
B[x]=(A[x]*a+B[x])%t2;
A[x]=t2;
return true;
}
int main()
{
int T=read();
while(T--)
{
m=read();n=read();res=1;ans=0;a=0;b=0;
for(int i=1;i<=n;i++)A[i]=read();
for(int i=1;i<=n;i++)B[i]=read();
for(int i=1;i<=n;i++)id[i]=true;
int bz=1;
for(int i=2;i<=n&&bz;i++)
{
if(!merge(1,i))bz=0;
}
if(!bz)printf("0\n");
else
{
ans=(A[1]+B[1])%A[1];
if(m<ans)printf("0\n");
else printf("%lld\n",(m-ans)/A[1]+((ans==0)?(0ll):1ll));
}
}
}