题目链接

  哇杜教筛超炫的

  有没有见过$O(n^\frac{2}{3})$求欧拉函数前缀和的算法?没有吧?蛤蛤蛤

  首先我们来看狄利克雷卷积是什么

  首先我们把定义域是整数,陪域是复数的函数叫做数论函数。

  然后狄利克雷卷积是个函数和函数的运算。

  比如说有两个数论函数f,g

  那么它们的狄利克雷卷积就是f*g,记为h

  然后我们惊奇地发现$h(i)=\sum\limits_{d|i}f(d)g(\frac{i}{d})$

  而且狄利克雷卷积好像是个群,然后它就能满足交换律结合律分配律balaba

  那么这个玩意有什么卵用呢?

  (显然它很有卵用)

  我们再说一个数论函数叫单位元。

  e(1)=1 e(n)=0(n>1)

  然后我们发现任意函数f(x)有f*e=f

  然后就引出我们的杜教筛,这里计算莫比乌斯函数的前缀和

  设$S(n)=\sum\limits_{i=1}^{n}miu(i)$

  然后我们随便代一个数论函数g,套上狄利克雷卷积

  $\sum\limits_{i=1}^{n}(g*miu)(i)=\sum\limits_{i=1}^{n}\sum\limits_{d|i}miu(\frac{i}{d})g(d)$

  $=\sum\limits_{d=1}^{n}\sum\limits_{d|i}miu(\frac{i}{d})g(d)$

  $=\sum\limits_{d=1}^{n}g(d)\sum\limits_{i=1}^{\frac{n}{d}}miu(i)$

  $=\sum\limits_{d=1}^{n}g(d)S(\frac{n}{d})$
  所以说$g(1)S(n)=\sum\limits_{i=1}^{n}g(i)S(\frac{n}{i})-\sum\limits_{i=2}^{n}g(i)S(\frac{n}{i})$

       $=\sum\limits_{i=1}^{n}(g*miu)(i)-\sum\limits_{i=2}^{n}g(i)S(\frac{n}{i})$

  然后我们惊奇的发现,如果我们设g(x)=1

  因为1*miu=e(因为有个定理是$\sum\limits_{d|n}miu(d)=$  n=1时1,n>1时0)

  那么这玩意就变成了$S(n)=1-\sum\limits_{i=2}^{n}S(\frac{n}{d})$

  然后这个玩意可以先用线性筛求出$n^\frac{2}{3}$的前缀和,然后用这个表达式应用数论分块,递归搞搞就好了

  就问炫不炫

  

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<map>
#define maxn 5000000
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int prime[maxn],tot;
bool s[maxn];
long long phi[maxn];
long long miu[maxn];
map<int,long long>_phi,_miu; long long calcmiu(long long n){
if(n<maxn) return miu[n];
if(_miu.count(n)) return _miu[n];
long long x=,ans=;
while(x<=n){
long long y=n/(n/x);
ans-=calcmiu(n/x)*(y-x+);
x=y+;
}
return _miu[n]=ans;
} long long calcphi(long long n){
if(n<maxn) return phi[n];
if(_phi.count(n)) return _phi[n];
long long x=,ans=n*(n+)/;
while(x<=n){
long long y=n/(n/x);
ans-=calcphi(n/x)*(y-x+);
x=y+;
}
return _phi[n]=ans;
} int main(){
int T=read();
s[]=;miu[]=;phi[]=;miu[]=;phi[]=;
for(int i=;i<maxn;++i){
if(!s[i]){
s[i]=;
phi[i]=i-;
miu[i]=-;
prime[++tot]=i;
}
for(int j=;j<=tot&&prime[j]*i<maxn;++j){
s[prime[j]*i]=;
if(i%prime[j]){
miu[i*prime[j]]=-miu[i];
phi[i*prime[j]]=phi[i]*(prime[j]-);
}
else{
phi[i*prime[j]]=phi[i]*prime[j];
miu[i*prime[j]]=;
break;
}
}
}
for(int i=;i<maxn;++i){
phi[i]+=phi[i-];
miu[i]+=miu[i-];
}
while(T--){
long long n=read();
printf("%lld %lld\n",calcphi(n),calcmiu(n));
}
return ;
}

【Bzoj3944】杜教筛模板(狄利克雷卷积搞杜教筛)的更多相关文章

  1. 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛

    ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...

  2. BZOJ3944: Sum(杜教筛模板)

    BZOJ3944: Sum(杜教筛模板) 题面描述 传送门 题目分析 求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\) 数据范围线性不可做. ...

  3. P4213 【模板】杜教筛(Sum)(杜教筛)

    根据狄利克雷卷积的性质,可以在低于线性时间复杂度的情况下,求积性函数前缀和 公式 \[ 求\sum_{i=1}^{n}\mu(i) \] 因为\(\mu*I=\epsilon\) 所以设\(h=\mu ...

  4. 狄利克雷卷积&莫比乌斯反演总结

    狄利克雷卷积&莫比乌斯反演总结 Prepare 1.\([P]\)表示当\(P\)为真时\([P]\)为\(1\),否则为\(0\). 2.\(a|b\)指\(b\)被\(a\)整除. 3.一 ...

  5. HDU.5628.Clarke and math(狄利克雷卷积 快速幂)

    \(Description\) \[g(i)=\sum_{i_1|i}\sum_{i_2|i_1}\sum_{i_3|i_2}\cdots\sum_{i_k|i_{k-1}}f(i_k)\ mod\ ...

  6. BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...

  7. codeforces757E. Bash Plays with Functions(狄利克雷卷积 积性函数)

    http://codeforces.com/contest/757/problem/E 题意 Sol 非常骚的一道题 首先把给的式子化一下,设$u = d$,那么$v = n / d$ $$f_r(n ...

  8. 狄利克雷卷积&莫比乌斯反演证明

    狄利克雷卷积简介 卷积这名字听起来挺学究的,今天学了之后发现其实挺朴实hhh. 卷积: "(n)"表示到n的一个范围. 设\(f,g\)是两个数论函数(也就是说,以自然数集为定义域 ...

  9. 狄利克雷卷积 & 莫比乌斯反演

    积性函数与完全积性函数 积性函数 若一个数论函数\(f\)满足当\(gcd(n,m)=1\)时,\(f(nm)=f(n)f(m)\) 则称\(f\)为积性函数 一些常见的积性函数 完全积性函数 若一个 ...

随机推荐

  1. 【转载】Python实现图书馆预约功能

    注释: 1,原博主是:http://blog.csdn.net/cq361106306/article/details/42644001# 2,学校是我现在的学校,我最近也在研究这个,所以转了. 3, ...

  2. 发现知乎的一个Bug,并且我绕过了此Bug,沾沾自喜中...

    发现问题 在知乎点击修改头像,上传图片时发现一片空白.凭着程序员的直觉,第一反应时看下控制台是否有报错.果然发现如下: Refused to load the image 'data:image/jp ...

  3. 解决nginx bind() to 0.0.0.0:80 failed 问题

    nginx的配置文件一开始默认是80端口,出现这个错误多半是80端口已经被占用.这时候只需要把 server { listen 8088; server_name localhost lcsf.com ...

  4. CF Gym 100637F The Pool for Lucky Ones

    题意:给你一串非负整数,可以将一个非零数减1,加到相邻的数字上,要使其中所有最大数字的和最小. 题解:模拟可以过.也可以分析,可以要减少最大数字和,如果最大数字出现大于等于3次,可以把最大数字加一,或 ...

  5. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  6. JavaScript实用的例子

    ---恢复内容开始--- 1.发送验证码 <input id="send" type="button" value="发送验证码"&g ...

  7. java基础—面向对象2

    一.JAVA类的定义

  8. Bootstrap 标签

    本章将讲解bootstrap标签,标签可用于计数,提示和页面上其它的标记显示.使用class.laber来显示标签,如下面的实例所示 <!DOCTYPE html><html> ...

  9. ubuntu安装easygui模块

    使用pip安装easygui 如果未安装pip,则使用如下命令 sudo apt-get install python-pip 安装完pip后,使用如下命令安装easygui sudo pip ins ...

  10. Go IO && bufio

    IO IO包 是对数据流的操作.从哪里来, 怎么处理,再到哪里去. 图片来源 https://medium.com/learning-the-go-programming-language/strea ...