求
令
暂且暴力枚举n的因子. 由于数据范围较大, 最好预处理所有
于是可以递推计算.
但还是决定先在求答案枚举n的因子那里优化: 同样可以用筛法. 时间复杂度变为
看了大爷们的题解, 呃......
来自Po姐的证明: 当
来自iamxym的证明: 首先有这样两个式子:
由等式
#include <bits/stdc++.h>
#define For(i, a, b) for (int i = (a), i##_ = (b); i <= i##_; ++i)
using namespace std;
typedef long long ll;
const int N = 1e6;
ll sum[N + 1], ans[N + 1];
void sieve()
{
For (i, 1, N) {
sum[i] += (ll)i*(i+1)/2;
for (int j = 2; i*j <= N; ++j)
sum[i*j] -= j*sum[i];
}
For (i, 1, N) {
for (int j = 1; i*j <= N; ++j)
ans[i*j] += sum[i];
ans[i] *= i;
}
}
int main()
{
sieve();
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
printf("%lld\n", ans[n]);
}
return 0;
}