P2303 [SDOi2012]Longge的问题

题目背景

SDOi2012

题目描述

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

输入格式

一个整数,为N。

输出格式

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

输入输出样例

输入 #1
6
输出 #1
15

说明/提示

对于60%的数据,0<N<=2^16

对于100%的数据,0<N<=2^32

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

long long n;

int main () {
	scanf("%lld",&n);
	long long ans=n;
	for(long long i=2; i*i<=n; ++i)
		if(n%i==0) {
			int b=0;
			while(n%i==0)
				++b,n/=i;
			ans/=i;
			ans*=b*i-b+i;
		}
	if(n>1)
		ans/=n,ans*=2*n-1;
	printf("%lld\n",ans);
	return 0;
}

 

posted @ 2019-09-08 14:22  双子最可爱啦  阅读(130)  评论(0编辑  收藏  举报