HDU1573 X问题

题目链接: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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39564498/article/details/81327847