AC通道:http://vjudge.net/problem/HDU-1573
【题目描述】
求在小于等于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)。
【题解】
模板题,为读者提供一个中国剩余定理(非互质版)的模板
/*************
HDU 1573
by chty
2016.11.2
*************/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
int T,n,s,M,ans,flag,a[15],m[15];
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
void exgcd(int a,int b,int &g,int &x,int &y)
{
if(b==0) {x=1; y=0; g=a; return;}
exgcd(b,a%b,g,x,y);
int t=x;x=y;y=t-a/b*y;
}
void China()
{
int A=a[1],k,y; M=m[1];
for(int i=2;i<=n;i++)
{
int da=a[i]-A,g;
exgcd(M,m[i],g,k,y);
if(da%g) {flag=1; return;}
int t=m[i]/g;
k*=da/g;
k=(k+t)%t;
A+=k*M;
M=M*m[i]/g;
A=(A+M)%M;
}
ans=A;
}
int main()
{
freopen("cin.in","r",stdin);
freopen("cout.out","w",stdout);
T=read();
while(T--)
{
s=read(); n=read(); flag=0;
for(int i=1;i<=n;i++) m[i]=read();
for(int i=1;i<=n;i++) a[i]=read();
China();
if(ans>s||flag) {printf("0\n"); continue;}
int sum=(s-ans)/M+1;
if(ans==0) sum--;
printf("%d\n",sum);
}
return 0;
}