4:倍数问题-4

4:倍数问题-4
时间限制: 1 S | 内存限制: 8192 KB
Accept: 170 | Submit: 330
[提交] [讨论版]
描述
确定p~q中有几个整数是a的倍数,或者是b的倍数。

输入
一个正整数n,表示有n组案例。

每组案例由3个正整数p、q、a、b组成(p<=q<=10亿)。

输出
针对每组案例,输出一个整数,表示p~q中(包含p和q)有几个整数是a的倍数,或者是b的倍数。

每组案例输出完都要换行。

样例输入
1

1 100 2 3

样例输出
67

HINT

来源
我是jg

        


// ConsoleApplication31.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
using namespace std;
//最大公约数
int gcd(int a, int b)
{
	int r;
	while (b > 0)
	{
		r = a % b;
		a = b;
		b = r;
	}
	return a;
}

//最小公倍数
int lcm(int a, int b)
{
	return a * b / gcd(a, b);
}

int fun(int a, int p, int q)
{
	ll cnt1 = 0;
	ll cnt2 = 0;
	cnt1 = p / a;
	
	
	cnt2 = q / a;
	
	ll cnt3 = cnt2 - cnt1;
	if ((p % a == 0) || (q % a == 0))
	{
		if (p != 1)
		{
			cnt3++;
		}
	}
	return cnt3;
}

int main()
{
	int n, a, b;
	ll p, q;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> p >> q >> a >> b;
		if (p == q)
		{
			if (p % a == 0 || p % b == 0)
			{
				cout << 1 << endl;
			}
		}
		else
		{
			ll cnt1 = 0, cnt2 = 0;
			ll s1 = fun(a, p, q);
			ll s2 = fun(b, p, q);
			int ss = lcm(a, b);
			ll s3 = fun(ss, p, q);

			cout << s1 + s2 - s3 << endl;
		}

	}
	return 0;
}


    
上一篇:2020-09-23 刷题记录


下一篇:浅谈web服务器的编写之http协议