BZOJ3944: Sum(杜教筛模板)
BZOJ3944: Sum(杜教筛模板)
题面描述
题目分析
求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\)
数据范围线性不可做。
需要使用杜教筛。
杜教筛可以在非线性时间里求出一个积性函数的前缀和。
借这里先写一些杜教筛内容。。。或许以后会补总结(雾
最开始扔积性函数:
- \(\mu(n)\),莫比乌斯函数
- \(\phi(n)\),欧拉函数。
- \(d(n)\),约数个数。
- \(\sigma(n)\),约数和函数。
- \(\epsilon(n)\),元函数,其值为\(\epsilon(n)=[n=1]\)。
- \(id(n)\),单位函数,\(id(n)=n\)。
- \(I(n)\),恒等函数,\(I(n)=1\)。
先放狄利克雷卷积的式子:
假设我们现在有两个数论函数\(f,g\),则这两个函数的卷积是\((f*g)(n)=\sum_{d\mid n}f(d)·g(\frac{n}{d})\)后面的括号表示范围,一般不写的时候可以默认其为\(n\)。
可以推出狄利克雷卷积满足以下运算律
- 交换律:\((f∗g=g∗f)\);
- 结合律:\(((f∗g)∗h=f∗(g∗h))\);
- 分配律:\(((f+g)∗h=f∗h+g∗h)\);
可以类比乘法运算律记忆。
那么我们可以开始搞杜教筛了。
现在我们要求一个积性函数\(f\)的前缀和,也就是\(\sum_{i=1}^{n}f(i)\)。
我们尝试构造两个积性函数使\(h=f*g\)
那么我们求一下\(\sum_{i=1}^{n}h(i)\)。
先记\(Sum(n)\)为\(\sum_{i=1}^{n}f(i)\)
则:
\]
然后明显可以反过来枚举。
\]
改成枚举\(\frac{i}{d}\)
\]
然后把式子的第一项提出来,整个代回去。
\]
移项
\]
这样\(g(1)\)明显为\(1\),所以这个式子就很明显了,只要\(h(i)\)的前缀和好求那么这个式子就可以在非线性时间里求出来了。
因为\(h=f*g\)我们换个形式表示上面的式子。
\]
所以只要找到一个合适的\(g\)就行了。
看个例子,我们这个题要求啥来着,\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\)
先看第一个。
就不推了,根据上面那个把\(f\)换成\(\mu\)直接代到最后面。
那么应该怎么给\(g\)取值呢,我们可以简明扼要的先看一下那一项变成什么了。
\]
有一个好消息,我们知道\(\mu*I=\epsilon\)。那么可以把上面的式子看成
\]
元函数的前缀和就非常好求,就是\(1\),所以我们求的答案
\]
再看第二个,我们还是相同的直接把\(\varphi\)代到最后面去。
则我们有式子
\]
思考一下,我们记得欧拉函数有个有趣的性质\(\sum_{d|n}\varphi(d)=n\)
我们把它用卷积的形式表达,就是\(\varphi*I=id\)
带入刚才的式子里面。
\]
明显的小高斯5岁就会的那个数列求和。。。
这个东西是\(n·(n+1)/2\)应该都知道。。。
然后代码实现的时候,可以先筛出根号范围内的答案,然后递归处理记忆化搜索。
由于需要储存下标非常大的值,所以需要使用哈希或者偷懒使用unordered_map,不要用map,会多一个log。
下面代码实测BZOJ可过,注意少开long long
是代码呢
#include <bits/stdc++.h>
#include <tr1/unordered_map>
using namespace std;
const int MAXN=4e6+7;
const int M=4e6;
#define ll long long
bool vis[MAXN];
int mu[MAXN],sum1[MAXN];
ll phi[MAXN],sum2[MAXN];
int cnt,prime[MAXN];
tr1::unordered_map<ll,ll> w1;
tr1::unordered_map<int,short> w;
inline void get(int N)
{
phi[1]=mu[1]=1;
for(int i=2;i<=N;i++){
if(!vis[i]){
prime[++prime[0]]=i;
mu[i]=-1;
phi[i]=i-1;
}
for(int j=1;j<=prime[0];j++){
if(i*prime[j]>N) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
} else mu[i*prime[j]]=-mu[i],phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(int i=1;i<=N;i++) sum1[i]=sum1[i-1]+mu[i],sum2[i]=sum2[i-1]+phi[i];
}
int djsmu(int x)
{
if(x<=M) return sum1[x];
if(w[x]) return w[x];
int ans=1;
for(int l=2,r;l<=x;l=r+1){
if(r==2147483647) break;
r=x/(x/l);
ans-=(r-l+1)*djsmu(x/l);
}
return w[x]=ans;
}
ll djsphi(int x)
{
if(x<=M) return sum2[x];
if(w1[x]) return w1[x];
ll ans=1ll*x*(1ll*x+1)/2;
for(int l=2,r;l<=x&&l>=0;l=r+1){
if(r==2147483647) break;
r=x/(x/l);
ans-=1ll*(r-l+1)*djsphi(x/l);
}
return w1[x]=ans;
}
inline int read()
{
int x=0,c=1;
char ch=' ';
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
while(ch=='-')c*=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*c;
}
int main()
{
int T=read();
get(M);
while(T--){
int n;
n=read();
printf("%lld %d\n", djsphi(n),djsmu(n));
}
}
BZOJ3944: Sum(杜教筛模板)的更多相关文章
- [bzoj3944] sum [杜教筛模板]
题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...
- [BZOJ3944]Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6201 Solved: 1606[Submit][Status][Discuss ...
- 【Bzoj3944】杜教筛模板(狄利克雷卷积搞杜教筛)
题目链接 哇杜教筛超炫的 有没有见过$O(n^\frac{2}{3})$求欧拉函数前缀和的算法?没有吧?蛤蛤蛤 首先我们来看狄利克雷卷积是什么 首先我们把定义域是整数,陪域是复数的函数叫做数论函数. ...
- bzoj3944: Sum 杜教筛板子题
板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...
- 3944: Sum[杜教筛]
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3471 Solved: 946[Submit][Status][Discuss] ...
- 洛谷P4213 Sum(杜教筛)
题目描述 给定一个正整数N(N\le2^{31}-1)N(N≤231−1) 求ans_1=\sum_{i=1}^n\phi(i),ans_2=\sum_{i=1}^n \mu(i)ans1=∑i=1 ...
- bzoj 3944 Sum —— 杜教筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944 杜教筛入门题! 看博客:https://www.cnblogs.com/zjp-sha ...
- BZOJ 3944: Sum [杜教筛]
3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...
- LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻
P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...
随机推荐
- 图论之最短路径(1)——Floyd Warshall & Dijkstra算法
开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...
- 详解Javascript中prototype属性
转自:https://www.jb51.net/article/91826.htm 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Jav ...
- MDK软件仿真常见问题
一直不知道MDK该怎么仿真调试程序,之前试了好几次都没有成功.因为有个程序一直不知道里面的变量对应着外部怎么的模式,今天想起可以用仿真调试的方法查看当外部设置某种模式的时候, 内部变量的变化,这样想来 ...
- 委托(Func与Action)
1.平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Sa ...
- poj2411 Mondriaan's Dream【状压DP】
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20822 Accepted: 117 ...
- Golang学习 - builtin 包
Go builtin包提供了go预先声明的函数.变量等的文档.这些函数变量等的实现其实并不是在builtin包里,只是为了方便文档组织. 这些内置的变量.函数.类型无需引入包即可使用. 默认提供的有: ...
- Golang学习-第二篇 搭建一个简单的Go Web服务器
序言 由于本人一直从事Web服务器端的程序开发,所以在学习Golang也想从Web这里开始学起,如果对Golang还不太清楚怎么搭建环境的朋友们可以参考我的上一篇文章 Golang的简单介绍及Wind ...
- load_1m
- Django - Jsonp、CORS
一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...
- Myeclipse 2013 professional 破解
破解前要先关闭Myeclipse2013 1.(1)输入usercode可以随便输入,(2)然后选择Myeclipse的版本,(3)点击systemid按钮 2.然后点击Tools菜单栏下的Rebui ...