How many integers can you find


1000 ms  |  内存限制: 65535


1


输入包含多组测试数据,每组数据占一行。

0<n<2^31,0<m1,m2<=10。

输出 每组数据输出占一行。 样例输入

12 2 3

样例输出

7

#include <iostream>
using std::endl;
using std::cout;
using std::cin;
//欧几里得求最大公约数
int gcd(int a, int b)
{
if (a % b == 0)
{
return b;
}
else
{
return gcd(b, a % b);
}
}
int main()
{
int n,m1, m2;
while (cin >> n >> m1 >> m2)
{
if (m1 != m2)
cout << (n-1)/m1+(n-1)/m2-(n-1)/((m1*m2)/gcd(m1,m2))<< endl;
else
cout << (n-1)/m1 << endl;
}
return 0;
}


暴力循环的话就一定会超时,

/* 能被m1整除的个数 + 能被m2整除的个数 - 能同时被m1和m2整除的个数 */
s = n / m1 + n / m2 - n / lcm(m1, m2);
if (n % m1 == 0) s--;
if (n % m2 == 0) s--;
if (n % lcm(m1, m2) == 0) s++;