题目
小G定义了两个函数,F(n) 为 n 的约数和,G(n) 为 F(1)+F(2)+...+F(n-1)+F(n)
小G想知道 G(G(n)) 等于多少
解题思路
遍历 1 到 n,其中约数为 i 的数的个数是 n/i。
所以,。
long long G(int x){
long long ans = 0;
for(int i=1; i<=x; ++i){
long long t = x/i;
ans += t*i;
}
return ans;
}上面的代码会超时,使用整除分块来实现。
C++代码
#include<iostream>
using namespace std;
long long G(int x){
long long ans = 0;
long long le = 1;
long long ri;
while(le <= x){
long long t = x/le;
ri = x/t;
ans += t*(le+ri)*(ri-le+1)/2; // 在 [1,x] 中,约数为 i 的数有 t 个,其中 i 是 [le,ri] 范围中的数
// 故,ans += t * (le + (le+1) + (le+2) + ... + ri)
le = ri+1;
}
return ans;
}
int main(){
int n;
cin >> n;
cout << G(G(n)) << endl;
return 0;
} 
京公网安备 11010502036488号