求值:
易得原式如下:
(通常,我们一般会选择将化成
来观察)
将原式复制一份得:
考虑到,可以将原式改为:
式中为了保证有意义,将值为
的一项提取出来。
两个求和式中分母相同的项可以合并。
即:
考虑枚举,所以只需要统计
的个数,因为
,所以
,所以满足这个条件的
的数量为
。
故答案为:
到这里就可以去解决这题了,但是还可以优化。
令,则有:
令,易知
是积性函数,于是可以
筛出。然后每次
算出结果。
搜先考虑的值,有:
设,令
,则:
于是有:
同理有:
解得:
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
vector<int>prime;
ll g[maxn];
bool vis[maxn];
inline void init() {
g[1]=1;
for(int i=2;i<maxn;++i) {
if(!vis[i]) {
prime.emplace_back(i);
g[i]=(ll)i*(i-1)+1;
}
for(auto &j:prime) {
if(i*j>maxn) break;
vis[i*j]=1;
if(i%j==0) {
g[i*j]=g[i]+(g[i]-g[i/j])*j*j;
break;
}
g[i*j]=g[i]*g[j];
}
}
}
signed main() {
cin.sync_with_stdio(false), cin.tie(nullptr),cout.tie(nullptr);
int T,n;
init();
cin>>T;
while(T--) {
cin>>n;
cout<<(g[n]+1)*n/2<<'\n';
}
return 0;
} 
京公网安备 11010502036488号