BZOJ 4805 欧拉函数求和
发布日期:2021-05-04 16:55:13 浏览次数:49 分类:技术文章

本文共 1305 字,大约阅读时间需要 4 分钟。

题目链接

题解

直接杜教筛筛 φ \varphi φ函数即可。

代码

#include #include 
#include
int read(){
int x=0,f=1; char ch=getchar(); while((ch<'0')||(ch>'9')) {
if(ch=='-') {
f=-f; } ch=getchar(); } while((ch>='0')&&(ch<='9')) {
x=x*10+ch-'0'; ch=getchar(); } return x*f;}const int maxn=1587401;int p[maxn+10],prime[maxn+10],cnt;long long phi[maxn+10];int getprime(){
p[1]=phi[1]=1; for(int i=2; i<=maxn; ++i) {
if(!p[i]) {
prime[++cnt]=i; phi[i]=i-1; } for(int j=1; (j<=cnt)&&(i*prime[j]<=maxn); ++j) {
int x=i*prime[j]; p[x]=1; if(i%prime[j]==0) {
phi[x]=phi[i]*prime[j]; break; } phi[x]=phi[i]*(prime[j]-1); } } for(int i=1; i<=maxn; ++i) {
phi[i]+=phi[i-1]; } return 0;}std::map
mp;long long getsum(int n){
if(n<=maxn) {
return phi[n]; } if(mp.count(n)) {
return mp[n]; } long long ans=1ll*n*(n+1)/2; for(int l=2,r; l<=n; l=r+1) {
r=n/(n/l); ans-=(r-l+1)*getsum(n/l); } return mp[n]=ans;}int n;int main(){
getprime(); n=read(); printf("%lld\n",getsum(n)); return 0;}

转载地址:https://blog.csdn.net/wang3312362136/article/details/85990607 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Luogu P3935 Calculating
下一篇:BZOJ 4407 于神之怒加强版

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月19日 04时31分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章