问题 B: 队伍能力值
题目描述
众所皆知ICPC和CCPC比赛是由3人一队参加的,每一个人有一个能力值,然后队伍能力值一定能被队内每一个人的能力值整除,我们已知一个队伍三个人的能力值a,b,c。并且队伍能力值在区间[L,R]内,请你判断该队伍的能力值有多少种可能?
输入
第一行输入三个整数a b c表示队伍中三个人的能力值。(1 <= a,b,c <= 1000) 第二行输入两个整数L
R表示队伍能力值的范围。(1 <= L <= R <= 1000000000)
输出
一个整数(队伍的能力值可能的情况数,结果可能为0)。
样例输入 Copy
2 4 8
7 16
样例输出 Copy
2
实现代码:
#include<iostream>
using namespace std;
int lcm(int x ,int y) //求x,y的最小公倍数
{
int r,m;
m = x*y;
while(y)
{
r = x % y;
x = y;
y = r;
}
return m/x;
}
int main(int argc, char const *argv[])
{
int a,b,c;
long l,r;
cin >> a >> b >> c ;
cin >> l >> r ;
int _lcm = lcm(lcm(a,b),c); //三个数的最小公倍数
int front = l / _lcm ;
int rear = r / _lcm;
num = rear - front ;
if(l%_lcm == 0)
num ++;
cout << num << endl;
return 0;
}
暴力枚举:
#include<iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int a,b,c;
cin >> a >> b >> c;
int l , r;
cin >> l >> r ;
int num = 0;
for (int i = l; i <= r; ++i)
{
if(i%a==0 && i%b==0 && i%c==0)
num++;
}
cout << num << endl;
return 0;
}
测试代码:
#include<iostream>
using namespace std;
int lcm(int x ,int y)
{
int r,m;
m = x*y;
while(y)
{
r = x % y;
x = y;
y = r;
}
return m/x;
}
int func1(int a,int b,int c,int l,int r) //正确
{
int num = 0;
for (int i = l; i <= r; ++i)
{
if(i%a==0 && i%b==0 && i%c==0)
num++;
}
return num;
}
int func2(int a,int b,int c,int l,int r)
{
int num ;
int lcm3 = lcm(lcm(a,b),c);
// int in = r - l;
// num = in / lcm3 ;
// if(r<lcm3 && in % lcm3 == 0)
// // cout << num << endl;
// return num;
// else
// // cout << num + 1 << endl;
// return num + 1;
int front = l / lcm3 ;
int rear = r / lcm3;
num = rear - front;
if(l%lcm3 == 0)
num ++;
return num ;
}
int main(int argc, char const *argv[])
{
for (int i = 0; i < 50; ++i)
{
int a = rand()%100 + 1;
// int b = rand()%1000 + 1;
// int c = rand()%1000 + 1;
int b = a;
int c = a;
long r = rand()%10000 + 1;
long l = rand()%r + 1;
int in = r - l;
int ra = func1(a,b,c,l,r);
int wa = func2(a,b,c,l,r);
if(ra != wa)
{
cout << "a = " << a << ",b = " << b << ",c = " << c << endl ;
cout << "l = " << l << ",r = " << r << endl;
cout << "in = " << in << endl ;
cout << "lcm = " << lcm(lcm(a,b),c) << endl;
cout << "right_answer = " << ra << endl;
cout << "wrong_answer = " << wa << endl;
cout << endl;
}
}
return 0;
}