Project Euler 512 Sums of totients of powers【欧拉函数】

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)ni1

所以 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=1nni1)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=1nni1)mod(n+1)=i=1n(1)i1

所以 为 奇 数 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值