题意
求T组,
分析
此题正解应该是莫比乌斯反演,时间复杂度为.我不会ε=ε=ε=ε=ε=ε=┌(; ̄◇ ̄)┘
我的方法是(所以升级版会TLE)
易知以为的倍数的有个,则为倍数的有个,记为
又记表示的个数,
因为,故可以倒着更新
最后去重就是答案
#pragma GCC optimize(3)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
using LL = long long;
const int MAXN = 2e6 + 5;
LL N, ans;
LL f[MAXN], g[MAXN];
int main(){
while(cin >> N){
if(!N) break;
ans = 0;
int i, j;
for(i = 1; i <= N; i++) f[i] = (N / i) * (N / i);
for(i = N; i >= 1; i--){
LL tmp = 0;
for(j = 2 * i; j <= N; j += i) tmp += g[j];
g[i] = f[i] - tmp;
}
for(i = 1; i <= N; i++) ans += i * g[i];
ans = (ans - N * (N + 1) / 2) / 2;
cout << ans << endl;
}
return 0;
}