【杜教筛】51Nod1239[欧拉函数之和]题解

来源:互联网 发布:淘宝客qq群里的优惠券 编辑:程序博客网 时间:2024/06/04 18:18

题目概述

ni=1φ(i)

解题报告

因为 n=ni=1nj=1[gcd(i,n)=j]=d|nndi=1[gcd(i,nd)=1]=d|iφ(nd) ,所以 Id=φ1

那么这道题只要像莫比乌斯函数之和一样用 1φ 就可以了,得到:

S(n)=i=1nId(i)i=2nS(ni)=n(n+1)2i=2nS(ni)

示例程序

#include<cstdio>#include<map>using namespace std;typedef long long LL;const int maxn=4700000,MOD=1e9+7,INV2=MOD+1>>1;int p[maxn+5],phi[maxn+5];bool pri[maxn+5];LL n;map<LL,int> f;#define Mod(x) ((x)%MOD)inline void AMOD(int &x,int tem) {if ((x+=tem)>=MOD) x-=MOD;}inline void Make(){    pri[1]=true;phi[1]=1;    for (int i=2;i<=maxn;i++)    {        if (!pri[i]) p[++p[0]]=i,phi[i]=i-1;        for (int j=1,t;j<=p[0]&&(t=i*p[j])<=maxn;j++)            if (i%p[j]) pri[t]=true,phi[t]=phi[i]*phi[p[j]]; else            {pri[t]=true;phi[t]=phi[i]*p[j];break;}    }    for (int i=2;i<=maxn;i++) AMOD(phi[i],phi[i-1]);}int Sum(LL n){    if (n<=maxn) return phi[n];if (f.count(n)) return f[n];    int ans=Mod(Mod(Mod(n+1)*Mod(n))*INV2);    for (LL l=2,r;l<=n;l=r+1)        r=n/(n/l),AMOD(ans,MOD-Mod(Mod(r-l+1)*Sum(n/l)));    return f[n]=ans;}int main(){    freopen("program.in","r",stdin);    freopen("program.out","w",stdout);    return Make(),scanf("%lld",&n),printf("%d\n",Sum(n)),0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 瀚蓝环境股票 大瀚猎头 上海瀚讯股吧 上海瀚讯 翰和瀚哪个寓意好 600323瀚蓝环境 苗瀚东是以谁为原型 瀚颖活净水 豪瀚自卸车 星瀚集团 新瀚城 格林瀚克通风设备 瀚蓝环境股份有限公司 瀚亚资本 瀚唐 石家庄瀚唐 阆中瀚唐酒店 瀚唐二手房 瀚唐小区 石家庄瀚唐小区 石家庄瀚唐怎么样 瀚唐地址 重庆瀚客餐饮培训中心 瀚海是指 瀚海指 瀚海 瀚海狼山 瀚海晴宇 瀚海星云bbs 瀚海思念城 瀚海星云 瀚海天悦湾 瀚海机械 陈瀚海 瀚海星辰皆是你 瀚海明玉酒店 北京瀚海国际拍卖有限公司 傻子王爷小白妃 瀚海初暖 瀚蓝环境千股千评 300762上海瀚讯