BZOJ3944: Sum(杜教筛模板)


题面描述

传送门

题目分析

求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\)

数据范围线性不可做。

需要使用杜教筛。

杜教筛可以在非线性时间里求出一个积性函数的前缀和。

借这里先写一些杜教筛内容。。。或许以后会补总结(雾

最开始扔积性函数:

  1. \(\mu(n)\),莫比乌斯函数
  2. \(\phi(n)\),欧拉函数。
  3. \(d(n)\),约数个数。
  4. \(\sigma(n)\),约数和函数。
  5. \(\epsilon(n)\),元函数,其值为\(\epsilon(n)=[n=1]\)。
  6. \(id(n)\),单位函数,\(id(n)=n\)。
  7. \(I(n)\),恒等函数,\(I(n)=1\)。

先放狄利克雷卷积的式子:

假设我们现在有两个数论函数\(f,g\),则这两个函数的卷积是\((f*g)(n)=\sum_{d\mid n}f(d)·g(\frac{n}{d})\)后面的括号表示范围,一般不写的时候可以默认其为\(n\)。

可以推出狄利克雷卷积满足以下运算律

  1. 交换律:\((f∗g=g∗f)\);
  2. 结合律:\(((f∗g)∗h=f∗(g∗h))\);
  3. 分配律:\(((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)\)

则:

\[\sum_{i=1}^{n}h(i)=\sum_{i=1}^{n}\sum_{d\mid i}g(d)f(\frac{i}{d})
\]

然后明显可以反过来枚举。

\[→\sum_{d=1}^{n}g(d)\sum_{d\mid i}f(\frac{i}{d})
\]

改成枚举\(\frac{i}{d}\)

\[→\sum_{d=1}^{n}g(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i)=\sum_{d=1}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)
\]

然后把式子的第一项提出来,整个代回去。

\[\sum_{i=1}^{n}h(i)=g(1)·S(n)+\sum_{d=2}^{n}g(d)·S(\lfloor\frac{n}{d}\rfloor)
\]

移项

\[g(1)·S(n)=\sum_{i=1}^{n}h(i)-\sum_{d=2}^{n}g(d)·S(\lfloor\frac{n}{d}\rfloor)
\]

这样\(g(1)\)明显为\(1\),所以这个式子就很明显了,只要\(h(i)\)的前缀和好求那么这个式子就可以在非线性时间里求出来了。

因为\(h=f*g\)我们换个形式表示上面的式子。

\[→g(1)·S(n)=\sum_{i=1}^{n}(f*g)(i)-\sum_{d=2}^{n}g(d)·S(\lfloor\frac{n}{d}\rfloor)
\]

所以只要找到一个合适的\(g\)就行了。

看个例子,我们这个题要求啥来着,\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\)

先看第一个。

就不推了,根据上面那个把\(f\)换成\(\mu\)直接代到最后面。

那么应该怎么给\(g\)取值呢,我们可以简明扼要的先看一下那一项变成什么了。

\[→\sum_{i=1}^{n}(\mu*g)(i)
\]

有一个好消息,我们知道\(\mu*I=\epsilon\)。那么可以把上面的式子看成

\[\sum_{i=1}^{n}(\mu*I)(i)=\sum_{i=1}^{n}\epsilon(i)
\]

元函数的前缀和就非常好求,就是\(1\),所以我们求的答案

\[S(n)=1-\sum_{d=2}^{n}g(d)·S(\lfloor\frac{n}{d}\rfloor)
\]

再看第二个,我们还是相同的直接把\(\varphi\)代到最后面去。

则我们有式子

\[\sum_{i=1}^{n}(\varphi*g)(i)
\]

思考一下,我们记得欧拉函数有个有趣的性质\(\sum_{d|n}\varphi(d)=n\)

我们把它用卷积的形式表达,就是\(\varphi*I=id\)

带入刚才的式子里面。

\[\sum_{i=1}^{n}(\varphi*g)(i)=\sum_{i=1}^{n}id(i)
\]

明显的小高斯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(杜教筛模板)的更多相关文章

  1. [bzoj3944] sum [杜教筛模板]

    题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...

  2. [BZOJ3944]Sum(杜教筛)

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6201  Solved: 1606[Submit][Status][Discuss ...

  3. 【Bzoj3944】杜教筛模板(狄利克雷卷积搞杜教筛)

    题目链接 哇杜教筛超炫的 有没有见过$O(n^\frac{2}{3})$求欧拉函数前缀和的算法?没有吧?蛤蛤蛤 首先我们来看狄利克雷卷积是什么 首先我们把定义域是整数,陪域是复数的函数叫做数论函数. ...

  4. bzoj3944: Sum 杜教筛板子题

    板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...

  5. 3944: Sum[杜教筛]

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3471  Solved: 946[Submit][Status][Discuss] ...

  6. 洛谷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 ...

  7. bzoj 3944 Sum —— 杜教筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944 杜教筛入门题! 看博客:https://www.cnblogs.com/zjp-sha ...

  8. BZOJ 3944: Sum [杜教筛]

    3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...

  9. LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻

    P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...

随机推荐

  1. hihocoder [Offer收割]编程练习赛14 剑刃风暴

    题目4 : 剑刃风暴 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 主宰尤涅若拥有一招非常厉害的招式——剑刃风暴,“无论是战士还是法师,都害怕尤涅若的武士刀剑技”. 现 ...

  2. 360全景图three.js与Photo-Sphere-Viewer-master 3D全景浏览开发

    1.支持WebGL和canvas的浏览器 (IE10, IE11支持, 但在IE里移动图片时很卡, 不一定是全部人都有这情况) 2.Three.js (文件较大, 有官网demo, 可不下载, 下载p ...

  3. virgo-tomcat访问日志的详细配置

    Tomcat 日志信息分为两类:1.运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息.2.访问日志信息,它记录的访问的时间.IP.访问的资料等相关信息. 关于tomcat访问日志的产 ...

  4. iOS UITextField输入后隐藏键盘

    1.首先在Interface Builder中选择TextFields,然后在Text Field Attributes中找到Text Input Traits,选择Return Key为done. ...

  5. java GC工作机制

    转自:http://www.cnblogs.com/hzdtf/articles/5419987.html GC:垃圾回收站,是将java的无用的堆对象进行清理,释放内存,以免发生内存泄露.在介绍ja ...

  6. 170620、springboot编程之页面版Hello World

    书接上回,把Hello World 在页面上显示! 1.在pom文件中加入web支持 <dependency> <groupId>org.springframework.boo ...

  7. Android NDK 导出独立工具链

    传统方式调试 NDK 开发的程序比较麻烦,先要编译成 JNI,又要导出 java接口,还要再写一个 java 工程,改一个地方又要连续改几处,这样效率是很低的.最频繁使用的关键工作路径(编译/调试环节 ...

  8. nginx lua模块安装

    1.安装LuaJIT,LuaJIT为LuaJIT is a Just-In-Time Compiler (JIT) for the Lua programming language wget http ...

  9. Git入门基本操作

    由David发表在天码营 Git简介 Git不仅仅是实际项目开发中进行代码管理的神器,也是你在天码营学习需要掌握的工具. Git是一种代码版本控制工具.我们在实际项目中和天码营的学习过程中都会产生大量 ...

  10. centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课

    centos    LAMP第二部分apache配置  下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转  配置apache的访问日志  配置静态文件缓存  配置防盗链 ...