oi-forever

2705: [SDOI2012]Longge的问题

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 3687  Solved: 2322
[Submit][Status][Discuss]

Description

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

Input

一个整数,为N。

Output

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

Sample Input

6

Sample Output

15

HINT

 

【数据范围】

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

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

 

总结:

本题要求

设f(x) 为

即1到n中与n的gcd为x的数的个数

转化一下

于是本题答案为

然后就枚举因子, 暴力即可

#include <bits/stdc++.h>
using namespace std;

#define LL long long
LL n;

LL phi(LL x) {
	LL res = x;
	for (LL i = 2; i * i <= x; ++i) {
		if(x % i == 0) res = res / i * (i - 1);
		while(x % i == 0) x /= i;
	} if(x > 1) res = res / x * (x - 1);
	return res;
}
LL calc(LL x) {
	LL res = 0;
	for (LL i = 1; i * i <= x; ++i) {
		if(i * i == x) res += i * phi(i);
		else if(x % i == 0) res += i * phi(x / i) + (x / i) * phi(i);
	} 
	return res;
}

int main() {
	scanf("%lld", &n);
	printf("%lld\n", calc(n));
	return 0;
}

  

 

 


 

分类:

数论

技术点:

相关文章: