51nod-1040-1040 最大公约数之和(欧拉函数)

原题链接

题目来源:  rihkddd
基准时间限制:1 秒 空间限制:131072 KB 分值: 80  难度:5级算法题
 收藏
 关注
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
Input
1个数N(N <= 10^9)
Output
公约数之和
Input示例
6
Output示例
15

先求出n的所有因子a, 再求出1到中满足与n的最大公约数为a的数个数,因为gcd(m, n) == a, 所以gcd(m / a, n/a) == 1

m/a <= n/a, 现在问题就变成求小于等于n/a与n/a互质的数的个数

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll euler(ll m){
	
	ll ans = m;
	for(ll i = 2; i * i <= m; i++){
		if(m % i == 0){
			ans = ans / i * (i - 1);
			while(m % i == 0)
			 m /= i;
		}
	}
	if(m > 1)
	 ans = ans / m * (m - 1);
	return ans;
}
int main(){
	
	ll n;
	ll ans = 0;
	
	scanf("%I64d", &n);
	for(ll i = 1; i * i <= n; i++){
		if(n % i == 0){
			ans += (n/i) * euler(i);
			if(i != n / i){
				ans +=  i * euler(n/i);
			}
		}
	}
	printf("%I64d\n", ans);
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值