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;
}