题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1573
题意
给定m个不互质数a[i],求n以内 满足 x % a[i] == b[i] 的 x 个数
题解:
余数:n % lcm(a[i])【最小公倍数】
当x>余数,范围为(余数+1 - 余数+lcm) ,分 n/lcm 个段, 判断x== lcm(a[i])+b[i]符合,即x== lcm(a[i])*n +b[i] — n倍的最小公倍数都符合条件
当x<余数,范围为(1 - yu) ,判断 x % lcm(a[i]) == b[i] 符合条件
#include<cstdio>
#include<iostream>
using namespace std;
int a[20],b[20];
int n,m,k,t,num,xx,cnt,flag;
int gcd(int a,int b) {
if(b!=0)return gcd(b,a%b);
return a;
}
int main() {
cin>>t;
while(t--) {
cin>>n>>m;
for(int i=0; i<m; i++)
cin>>a[i];
for(int i=0; i<m; i++)
cin>>b[i];
int lcm=1;
for(int i=0; i<m; i++) {// 依次求最小公倍
xx=gcd(lcm,a[i]);
lcm*=(a[i]/xx);
}
cnt=0;
for(int j=n%lcm+1; j<=n%lcm+lcm; j++) {// 当x>余数,(yu+1 - yu+lcm) 分 n/lcm 个段
flag=0;
for(int i=0; i<m; i++) {
if(j%a[i]==b[i])
flag=1;
else {
flag=0;
break;
}
}
if(flag) cnt+=n/lcm;//倍数
}
for(int j=1; j<=n%lcm; j++) {//当x<余数,(1 - yu)
flag=0;
for(int i=0; i<m; i++) {
if(j%a[i]==b[i])
flag=1;
else {
flag=0;
break;
}
}
if(flag)
cnt++;
}
cout<<cnt<<endl;
}
}