列表

详情


NC20351. [SDOI2012]LONGGE的问题

描述

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。
现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1 ≤ i ≤ N)。

输入描述

一个整数,为N。

输出描述

一个整数,为所求的答案。

示例1

输入:

6

输出:

15

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 9ms, 内存消耗: 476K, 提交时间: 2019-09-16 16:19:26

#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll n,ans;
int m;
ll phi(ll x)
{
    ll t=x;
    for(ll i=2;i<=m;i++)
        if(x%i==0)
        {
            t=t/i*(i-1);
            while(x%i==0)x/=i;
        }
    if(x>1)t=t/x*(x-1);
    return t;
}
int main()
{
	scanf("%lld",&n);
	m=sqrt(n);
	for(int i=1;i<=m;i++)
    	if(n%i==0)
    	{
	        ans+=(ll)i*phi(n/i);
            if(i*i<n)ans+=(ll)(n/i)*phi(i);  
	    }
	printf("%lld",ans);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 376K, 提交时间: 2020-08-14 14:12:11

#include<cstdio>
using namespace std;
typedef long long ll;
int main(){
	ll n, ans, j, i, k;
	scanf("%lld", &n);
	for(i = 2, ans = 1;i <= n / i;i++){
		for(j = 1, k = 0;!(n % i);n /= i, j *= i, k++);
		ans *= j + j / i * (i - 1) * k;
	}if(n > 1)ans *= 2 * n - 1;
	printf("%lld", ans);
	return 0;
}

上一题