http://acm.hdu.edu.cn/showproblem.php?pid=1573
#include<stdio.h>
__int64 a[11],m[11];
__int64 N;
__int64 M;
__int64 Exgcd(__int64 n,__int64 m,__int64 &x,__int64 &y)
{
if(m==0){
x=1;
y=0;
return n;
}
else
{
__int64 d= Exgcd(m,n%m,x,y);
__int64 tem;
tem=x;
x=y;
y=tem-n/m*y;
return d;
}
}
void solve()
{
__int64 x,y,a1,a2,m1,m2;
a1=a[1];m1=m[1];
for(int i=2;i<=M;++i)
{
a2=a[i];m2=m[i];
__int64 d=Exgcd(m1,m2,x,y);
if((a2-a1)%d!=0)
{
printf("0\n");
return ;
}
__int64 res=x*((a2-a1)/d);
res=(res%m2+m2)%m2;
a1=a1+m1*res;
m1=m1/d*m2; // 最小公倍数
a1=(a1%m1+m1)%m1;
a1=(a1%m1+m1)%m1;
}
__int64 ans=(N-a1)/m1+1;
if(a1>N) ans=0;
if(a1==0) ans--;
printf("%I64d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d",&N,&M);
__int64 i,j;
for(i=1;i<=M;++i)
scanf("%I64d",&m[i]);
for(i=1;i<=M;++i)
scanf("%I64d",&a[i]);
solve();
}
return 0;
}