求
,有
基本可以确定是数论分块了,但还得乘以
以
为例:
注意到每个块的答案贡献是
,设这个块的长度为
,那么就是
那么就直接用数论分块去累加每个块的答案贡献即可
总代码:
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define HelloWorld IOS;
signed main(){
HelloWorld;
int n; cin >> n;
int ans = 0;
for(int i = 1; i <= n; i ++){
int l = i, r = (n / (n / i));
int len = r - l + 1;
ans += (n / i) * (i + i + len - 1) * len / 2;
i = r;
}
cout << ans << endl;
return 0;
}



京公网安备 11010502036488号