求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10)。
3 10 3 1 2 3 0 1 2 100 7 3 4 5 6 7 8 9 1 2 3 4 5 6 7 10000 10 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9
1 0 3
参考:
http://blog.csdn.net/fyxz1314/article/details/38497299
http://blog.csdn.net/u010579068/article/details/45422941
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
int n,m;
int M[15],A[15];
void extend_Eculide(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
d=a;
x=1;
y=0;
return;
}
extend_Eculide(b,a%b,d,y,x);
y-=x*(a/b);
}
int main()
{
int i,T;
int m1,r1,m2,r2,flag;
int x,y,d,c,t;
scanf("%d",&T);
while(T--)
{
cin>>n>>m;
for(i=0;i<m;i++)
cin>>M[i];
for(i=0;i<m;i++)
cin>>A[i];
flag=0;
m1=M[0]; r1=A[0];
for(i=1;i<m;i++)
{
m2=M[i]; r2=A[i];
extend_Eculide(m1,m2,d,x,y);
c=r2-r1;
if(c%d)
{
flag=1;
break;
}
t=m2/d;
x=(c/d*x%t+t)%t;
r1=m1*x+r1;
m1=m1*m2/d;
}
if(flag||n<r1)
{
cout<<0<<endl;
}
else
{
int ans=(n-r1)/m1+1;
if(r1==0)
ans--;
cout<<ans<<endl;
}
}
return 0;
}