Sums of totients of powers
f ( n ) = ( ∑ i = 1 n ϕ ( n i ) ) m o d ( n + 1 ) f(n)=(\sum_{i=1}^{n} \phi(n^i)) mod(n+1) f(n)=(∑i=1nϕ(ni))mod(n+1)
g ( n ) = ∑ i = 1 n f ( i ) g(n)=\sum_{i=1}^{n} f(i) g(n)=∑i=1nf(i)
因为 ϕ ( n i ) = ϕ ( n ) ∗ n i − 1 \phi(n^i)=\phi(n)*n^{i-1} ϕ(ni)=ϕ(n)∗ni−1
所以 f ( n ) = ϕ ( n ) ( ∑ i = 1 n n i − 1 ) m o d ( n + 1 ) f(n)=\phi(n)(\sum_{i=1}^{n} n^{i-1})mod(n+1) f(n)=ϕ(n)(∑i=1nni−1)mod(n+1)
因为 ( ∑ i = 1 n n i − 1 ) m o d ( n + 1 ) = ∑ i = 1 n ( − 1 ) i − 1 (\sum_{i=1}^{n} n^{i-1})mod(n+1)=\sum_{i=1}^{n} (-1)^{i-1} (∑i=1nni−1)mod(n+1)=∑i=1n(−1)i−1
所以 为 奇 数 g ( n ) = ∑ i = 1 n ϕ ( i ) ∗ [ i 为 奇 数 ] 为奇数g(n)=\sum_{i=1}^{n} \phi(i)*[i为奇数] 为奇数g(n)=∑i=1nϕ(i)∗[i为奇数]
处理时可以讲偶数位删去,优化空间。
#include<cstdio>
using namespace std;
const int MAXN=25e7,MAXM=5e8;
int p[MAXN/5+1],phi[MAXN+5];bool vis[MAXN+5];
void make_p(){
vis[0]=vis[1]=1;phi[1]=1;
for(int i=3;i<=MAXM;i+=2){
if(!vis[i+1>>1]) p[++p[0]]=i,phi[i+1>>1]=i-1;
for(int j=1;j<=p[0]&&i*p[j]<=MAXM;j++){
vis[(i*p[j]+1)>>1]=1;
if(i%p[j]==0){phi[(i*p[j]+1)>>1]=phi[i+1>>1]*p[j];break;}
phi[(i*p[j]+1)>>1]=phi[i+1>>1]*(p[j]-1);
}
}
}
long long Ans;
int main(){
make_p();
for(int i=1;i<=MAXM;i+=2) Ans+=phi[i+1>>1];
printf("%lld\n",Ans);
return 0;
}
//50660591862310323