题目:
求在小于等于N的正整数中有多少个X满足:
X mod a[0] = b[0]
X mod a[1] = b[1]
X mod a[2] = b[2]00
…
X mod a[i] = b[i]
...
(0 < a[i] <= 10,i<=M)
INPUT:
第一行是测试数据组数
每一组第一行为N,M
(0 < N <= 1000,000,000 , 0 < M <= 10)
接下来两行,代表M个ai和M个bi
OUTPUT:
对于每一组输入,对应一行输出答案
分析:
求解X的过程还是模板
但是在判断有多少个X的时候要小心,如果最小的x比N大,则答案是0;如果最小的x是0,则除法算出来的结果要减1
代码:
#include<iostream>
using namespace std;
void exgcd(int a,int b,int& d,int& x,int& y){
if(b==0){
d=a;x=1;y=0;
}
else{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int a[15],b[15];
int main(){
int t,num;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>b[i];
}
int lasta=a[0],lastb=b[0];
int ok=0;
for(int i=1;i<m;i++){
int c=b[i]-lastb;
int d,x,y;
exgcd(lasta,a[i],d,x,y);
if(c%d){
ok=1;
cout<<0<<endl;
break;
}
x*=(c/d);
int k=a[i]/d;
x=(x%k+k)%k;
lastb=lasta*x+lastb;
lasta=lasta*a[i]/d;
}
if(ok)continue;
int x0=(lastb%lasta+lasta)%lasta;
//cout<<"x0: "<<x0<<" lcd: "<<lasta<<endl;
if(n>=x0)num=(n-x0)/lasta+1;
else num=0;
if(x0==0)num--;
cout<<num<<endl;
}
return 0;
}