杜教筛--51nod1239 欧拉函数之和
求$\sum_{i=1}^{n}\varphi (i)$,$n\leqslant 1e10$。
这里先把杜教筛的一般套路贴一下:
要求$S(n)=\sum_{i=1}^{n}f(i)$,而现在有一数论函数$g(i)$,$g(i)$的前缀和很无脑,且$f$和$g$的狄利克雷卷积的前缀和很无脑(太巧了吧。。),那么由
$\sum_{i=1}^{n}\sum_{d|i}f(d)g(\frac{i}{d})$
闪一句,常用套路:设$i=kd$,转而枚举$k$。
$=\sum_{k=1}^{n}g(k)\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor}f(d)$
$=\sum_{k=1}^{n}g(k)S(\frac{n}{k})$
可得
$g(1)S(n)=\sum_{i=1}^{n}\sum_{d|i}f(d)g(\frac{i}{d})-\sum_{k=2}^{n}g(k)S(\left \lfloor \frac{n}{k} \right \rfloor)$
进而递推求S。
官方复杂度:(假如构造的卷积的前缀和和g的前缀和都是O(1)可知)由于S那个除法的取值范围:1,2,……,m-1,m,n/m,n/(m-1),……,n,
可以想到预处理一部分再算一部分,假设预处理了$n^k$,那么总的复杂度就是:$max(n^k,没预处理的那一段)$,
没预处理的那段就是$\sum_{i=1}^{n^{1-k}}\sqrt{\frac{n}{i}}=n^{\frac{1}{2}}\sum_{i=1}^{n^{1-k}}i^{-\frac{1}{2}}\approx n^{\frac{1}{2}}n^\frac{1-k}{2}$
所以总的复杂度就是$max(n^k,n^{\frac{1}{2}}n^\frac{1-k}{2})$,当$\frac{1}{2}+\frac{1-k}{2}=k$时取得最小复杂度,$k=\frac{2}{3}$.
然而我这里有点不懂:因为没预处理的那段我们是直接递归+记忆化的,那记忆化的那部分复杂度怎么算?如何证明杜教筛过程中出现的数字个数的上限?暂不知。先用着。
好那这道题,我们要找一个前缀和无脑且和$\varphi $乘起来无脑的一个函数--1!——就是f(x)=1不知道叫什么——因为有$\varphi *1=Id$,$Id(x)=x$。
那就带进去玩一玩:
$\sum_{i=1}^{n}\sum_{d|i}\varphi (d)=\sum_{k=1}^{n}1\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor}\varphi (d)= \sum_{k=1}^{n}S(\left \lfloor \frac{n}{k} \right \rfloor)$
玩够一百下再玩一百下:
$S(n)=\sum_{i=1}^{n}\sum_{d|i}1*\varphi (d)-\sum_{k=2}^{n}S(\left \lfloor \frac{n}{k} \right \rfloor)=\frac{n(n+1)}{2}-\sum_{k=2}^{n}S(\left \lfloor \frac{n}{k} \right \rfloor)$。
OK丢去筛吧。
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
//#include<bitset>
using namespace std; #define LL long long
LL n,m;
#define maxn 5000011
const int mod=1e9+;
int phi[maxn],sumphi[maxn],prime[maxn/],lp; bool notprime[maxn];
void pre(int n)
{
lp=; phi[]=; sumphi[]=;
for (int i=;i<=n;i++)
{
if (!notprime[i]) {prime[++lp]=i; phi[i]=i-;}
sumphi[i]=sumphi[i-]+phi[i];
sumphi[i]-=sumphi[i]>=mod?mod:;
for (int j=,tmp;j<=lp && 1ll*prime[j]*i<=n;j++)
{
notprime[tmp=i*prime[j]]=;
if (i%prime[j]) phi[tmp]=1ll*phi[i]*(prime[j]-)%mod;
else {phi[tmp]=1ll*phi[i]*prime[j]%mod; break;}
}
}
} struct Edge{LL to; int v,next;};
#define maxh 1000007
struct Hash
{
int first[maxh],le;Edge edge[maxn];
Hash() {le=;}
void insert(LL y,int v)
{int x=y%maxh; Edge &e=edge[le]; e.to=y; e.v=v; e.next=first[x]; first[x]=le++;}
int find(LL y)
{
int x=y%maxh;
for (int i=first[x];i;i=edge[i].next) if (edge[i].to==y) return edge[i].v;
return -;
}
}h; int du(LL n)
{
if (n<=m) return sumphi[n];
int tmp=h.find(n); if (tmp!=-) return tmp;
LL tot=;
for (LL i=,last;i<=n;i=last+)
{
last=n/(n/i);
tot+=(last-i+)*du(n/i)%mod;
tot-=tot>=mod?mod:;
}
LL ans=(n%mod)*((n+)%mod)%mod*((mod+)>>)%mod-tot;
ans+=ans<?mod:;
h.insert(n,ans);
return ans;
} int main()
{
scanf("%lld",&n);
m=(LL)pow(pow(n,1.0/),); pre(m);
printf("%d\n",du(n));
return ;
}
杜教筛--51nod1239 欧拉函数之和的更多相关文章
- 【learning】杜教筛求欧拉函数前缀和
我们考虑利用\(\sum\limits_{d|n}\varphi(d)=n\)这一性质来处理这个问题 设\(f(n)=\sum\limits_{i=1}^{n}\varphi(i)\) 那么我们可以得 ...
- 51nod1239 欧拉函数之和
跟1244差不多. //由于(x+1)没有先mod一下一直WA三个点我... //由于(x+1)没有先mod一下一直WA三个点我... #include<cstdio> #include& ...
- [51nod1239] 欧拉函数之和(杜教筛)
题面 传送门 题解 话说--就一个杜教筛--刚才那道拿过来改几行就行了-- //minamoto #include<bits/stdc++.h> #define R register #d ...
- [51nod1239欧拉函数之和]
来自FallDream的博客,未经允许,请勿转载,谢谢 --------------------------------------------- 给定n,求$S(n)=\sum_{i=1}^{n}\ ...
- 51 NOD 1239 欧拉函数之和(杜教筛)
1239 欧拉函数之和 基准时间限制:3 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目.此函数以其首名研究 ...
- [51Nod 1244] - 莫比乌斯函数之和 & [51Nod 1239] - 欧拉函数之和 (杜教筛板题)
[51Nod 1244] - 莫比乌斯函数之和 求∑i=1Nμ(i)\sum_{i=1}^Nμ(i)∑i=1Nμ(i) 开推 ∑d∣nμ(d)=[n==1]\sum_{d|n}\mu(d)=[n== ...
- 【51nod-1239&1244】欧拉函数之和&莫比乌斯函数之和 杜教筛
题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod. ...
- 51nod 1239 欧拉函数之和(杜教筛)
[题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 [题目大意] 计算欧拉函数的前缀和 [题解] 我们 ...
- 【51nod】1239 欧拉函数之和 杜教筛
[题意]给定n,求Σφ(i),n<=10^10. [算法]杜教筛 [题解] 定义$s(n)=\sum_{i=1}^{n}\varphi(i)$ 杜教筛$\sum_{i=1}^{n}(\varph ...
随机推荐
- 5 月编程语言排行榜:Java第一,R跌出Top20
我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...
- sublime text3安装Package Control
转自:https://www.cnblogs.com/lq147760524/p/8202521.html 一.下载Sublime3 https://www.sublimetext.com/3 二.安 ...
- Nodejs AES加密不一致问题的解决
最近在做android游戏,客户端与Nodejs服务端数据的交互用AES进行加密,发现Nodejs与java的加密形式不一样.查询N久资料发现java端需要对密钥再MD5加密一遍(我了个大擦),本来对 ...
- 一起来学SpringBoot(十七)优雅的参数校验
参数校验在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动方法内代码显得冗长每次要看哪些参数 ...
- Tensorflow入门-上
前置准备 在阅读本文之前,请确定你已经了解神经网络的基本结构以及前向传播.后向传播的基本原理,如果尚未了解,可以查看下文. 深度学习之神经网络 什么是TensorFlow? TensorFlow是Go ...
- Flutter web环境变量搭建及开发
使用flutter开发app已有三个月,有一些行为形成了惯性,在搭建flutter web环境变量时走了不少的坑,分享出来,免得其他小伙伴再走一遍. 首先flutter的版本要使用1.5及以上版本 d ...
- zTree 点击文字 勾选check
callback: { onClick:function(event, treeId, treeNode){ console.info("onClick") var treeObj ...
- JS Object 属性判断
in 方法 var shapeInfo = {name:“lium”}; if (“name” in shapeInfo) {...}
- 获取当前时间(日期格式) && 获取当前加一年的时间(日期格式)
获取当前时间,日期格式function currentDate() { var date = new Date(); var y = date.getFullYear(); var m = date. ...
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...