思路
-
1-n的总和减去区间内所有的a的倍数和,减去所有的b的倍数和,a和b的公倍数会被多减一次,所以要加上,但要判断公倍数是否小于n。
-
求a,b的最小公倍数。用头文件algorithm带的函数__gcd(a,b)先求最大公因数,则最小公倍数可由a*b/__gcd(a,b)求出。
代码
#include <iostream>
#include <algorithm>
using namespace std;
long long f(long long a){//1-a的和
long long sum=(a+1)*a/2;
return sum;
}
int main()
{
long long n,a,b;
cin>>n>>a>>b;
long long ans;
long long sum,sum_a,sum_b,lcm,sum_ab;
sum=f(n);
sum_a=f(n/a)*a;
sum_b=f(n/b)*b;
lcm=(a*b)/__gcd(a,b);//求a,b的最小公倍数
sum_ab=f(n/lcm)*lcm;
ans=sum-sum_a-sum_b;
if(lcm<=n) ans+=sum_ab;
cout<<ans;
return 0;
}