求1到N中所有既不是A的倍数,也不是B的倍数的数的总和

227 阅读1分钟

学校oj

思路

  1. 1-n的总和减去区间内所有的a的倍数和,减去所有的b的倍数和,a和b的公倍数会被多减一次,所以要加上,但要判断公倍数是否小于n。

  2. 求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;
}