首页 > 其他分享 >杜教筛 & Powerful Number 筛

杜教筛 & Powerful Number 筛

时间:2023-04-30 09:14:31浏览次数:50  
标签:frac cdot sum Powerful mid varphi Number 杜教 id

迪利克雷卷积

对于数论函数 \(F\),\(G\),我们定义迪利克雷卷积的结果 \(H=F*G\) 为

\[H_n=\sum_{d\mid n}F_d G_\frac{n}{d} \]

有些好的性质,比如:对于积性函数 \(F\) 与 \(G\),其迪利克雷卷积 \(F*G\) 也是积性函数;而在迪利克雷卷积的意义下,积性函数 \(F\) 的逆也是积性函数(逆满足 \(F^{-1}*F=e\))。

当公因式是完全积性函数时,点乘对迪利克雷卷积有分配律(下式中要求 \(X\) 为完全积性函数):

\[(A\cdot X)*(B\cdot X)=(A*B)\cdot X \]

杜教筛

假设我们对于积性函数 \(f\),要求出 \(f\) 的前缀和,即 \(\sum_{i\le n}f_i\)。我们找到积性函数 \(g\),设 \(h=f*g\)。设 \(S_f\) 表示 \(f\) 的前缀和,则有:

\[\begin{aligned} S_h(n)&=\sum_{i=1}^{n}\sum_{d\mid i}g_df_{i/d}\\ &=\sum_{d=1}^{n}g_d\sum_{i=1}^{\lfloor n/d\rfloor }f_i\\ &=\sum_{d=1}^{n}g_dS_f(\lfloor n/d\rfloor) \end{aligned} \]

把 \(d>1\) 的项提到左边去,得到

\[S_f(n)=S_h(n)-\sum_{d=2}^{n}g_dS_f(\lfloor n/d\rfloor) \]

我们把 \(\le n^{2/3}\) 的 \(S_f\) 全部线性筛处理了,然后按上面的式子递归算,最后得到的处理 \(S_f\) 的复杂度是 \(O(n^{2/3})\)。

一些常见恒等式

关于 \(\mu\):

  • \(\mu*I=\epsilon\)

  • \((\mu \cdot id_k)*id_k=(\mu\cdot id_k)*(I\cdot id_k)=(\mu \cdot I)*id_k=\epsilon\)

  • \(\mu^2=\sum_{d^2\mid n} \mu(d)\)
    有了这个就可以求 \(\mu^2\) 的前缀和,即

    \[\begin{aligned} \sum_{i=1}^{n} \mu(i)^2&=\sum_{i=1}^{n}\sum_{d^2\mid i}\mu(i)\\ &=\sum_{d=1}^{\sqrt{n}} \mu(d)\sum_{d^2\mid i}1\\ &=\sum_{d=1}^{\sqrt{n}} \mu(d)\lfloor\frac{n}{d^2}\rfloor \end{aligned} \]

    然后就可以 \(O(\sqrt n)\) 求了。

关于 \(\varphi\):

  • \(\varphi*I=id\)
  • \((\varphi \cdot id_k)*id_k=(\varphi\cdot id_k)*(I\cdot id_k)=(\varphi \cdot I)*id_k=id_{k+1}\)
  • \(\varphi(ij)=\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\)
    不断地带 \(\varphi(x)=x\prod_{d\mid x}\frac{d-1}{d}\) 即可。

BZOJ3512 DZY Loves Math IV

对于积性函数的性质的应用。

一个比较有趣的技巧:对于 \(x\),设其为 \(x=\prod p_i^{q_i}\),我们设 \(q=\prod p_i\),\(p=\frac{x}{q}\),我们考虑直接求 \(\varphi\) 的式子,每个因数只有在第一次会有特殊处理,其他情况都是直接乘上,所以 \(\varphi(x)=p\varphi(q)\),且对于任意 \(i\),都有 \(\varphi(ix)=p\varphi(iq)\)。然后由于 \(q\) 每个数都只有一次项,所以有很多互质的性质,可以在积性函数上得以体现。

设 \(S(n,m)=\sum_{i=1}^{m}\varphi(i\times n)\),我们把 \(n\) 拆成 \(pq\),则有

\[\begin{aligned} S(n,m)&=\sum_{i=1}^{m}\varphi(iq)p\\ &=p\sum_{i=1}^{m}\gcd(i,q)\times \varphi(\frac{q}{\gcd(i,q)})\varphi(i)\\ &=p\sum_{i=1}^{m}\varphi(i)\varphi(\frac{q}{\gcd(i,q)})\sum_{d\mid \gcd(i,q)}\varphi(d)\\ &=p\sum_{i=1}^{m}\varphi(i)\sum_{d\mid i,d\mid q}\varphi(\frac{qd}{\gcd(i,q)})\\ &=p\sum_{i=1}^{m}\varphi(i)\sum_{x\mid i,x\mid q}\varphi(\frac{d}{x})\\ &=p\sum_{d\mid q}^{n}\varphi(\frac{q}{d})\sum_{d\mid i}^{m}\varphi(i)\\ &=p\sum_{d\mid q}^{n}\varphi(\frac{q}{d})S(d,\lfloor\frac{m}{d}\rfloor) \end{aligned} \]

然后直接递推即可,复杂度分析和杜教筛相似。

LOJ6686 Stupid GCD

求 \(\sum_{i=1}^{n}\gcd(\lfloor\sqrt[3]{i}\rfloor,i)\)。

考虑 \(n=k^3+1\) 的情况。如果不是的话后面应该还要有一项,那一项单独处理是类似(这么写只是因为一开始漏考虑了…)。

\[\begin{aligned} \sum_{i=1}^{n}\gcd(\lfloor\sqrt[3]{i}\rfloor,i) &=\sum_{i=1}^{n}\sum_{d\mid \lfloor\sqrt[3]{i}\rfloor,d\mid i} \varphi(d)\\ &=\sum_{i=1}^{k-1}\sum_{j=i^3}^{(i+1)^3-1}\sum_{d\mid i,d\mid j}\varphi(d)\\ &=\sum_{d=1}^{k-1}\varphi(d)\sum_{d\mid i}^{k-1}\lfloor\frac{i^3+3i^2+3i}{d}\rfloor-\lfloor\frac{i^3-1}{d}\rfloor\\ &=\sum_{d=1}^{k-1}\varphi(d)\sum_{i=1}^{\lfloor\frac{k-1}{d}\rfloor}3di^2+3i+1\\ &=3\sum_{d=1}^{k-1}\varphi(d)d\sum_{i=1}^{\lfloor\frac{k-1}{d}\rfloor}i^2+\sum_{d=1}^{k-1}\varphi(d)\sum_{i=1}^{\frac{k-1}{d}}3i+1 \end{aligned} \]

\(\varphi\cdot id_k\) 显然是可以杜教筛的(上面说过),于是就可以做了。

Powerful Number 筛

定义一个数为 Powerful Number,当且仅当它的每个质因子次数都 \(>2\)。由于每个 PN 都可以表示成 \(x^2y^3\),于是可以发现 \(\le n\) 的 PN 个数为 \(O(\sqrt n)\)。

我们需要求出积性函数 \(f(x)\) 的前缀和,考虑构造积性函数 \(g(x),h(x)\),满足 \(f=g*h\),且 \(f(p)=g(p)\)。此时我们发现 \(f(p)=g(p)h(1)+g(1)h(p)\),由于 \(g(1)=h(1)=1\),于是 \(h(p)=0\)。对于积性函数,如果它在质数处取 \(0\),那么显然它只有在 PN 处才可能有值。

于是我们要求的

\[\sum_{i=1}^{n} f(i)=\sum_{ij} g(i)h(j)\\\ = \sum_{i\le n} h(i) \sum_{j=1}^{n/i} g(j) \]

由于 \(h\) 只在 PN 处有值,所以我们相当于只需要算 \(\sqrt{n}\) 个 \(g\) 的前缀和在 \(\lfloor \frac{n}{i} \rfloor\) 处的值即可。于是我们只需要对 \(g\) 做杜教筛即可。

还有一件事情,就是如何确定 \(h\)。我们按照 \(h\) 的定义式进行处理

\[f(p^k)=\sum_{i+j=k}g(p^i)h(p^j)\\ h(p^k)=f(p^k)-\sum_{i=0}^{k-1}h(p^i)g(p^{k-i}) \]

由于 PN 的质因子 \(p\) 一定 \(\le \sqrt n\),于是就可以 \(O(\sqrt n\log^2 n)\) 求出所有所需的 \(h\) 了。

找 PN 的过程枚举每个 \(p\) 的次数,dfs 即可。

LG5325 【模板】Min25筛

题目中 \(f(p^k)=p^k(p^k-1)\)。于是 \(f(p)=p(p-1)\)。我们取积性函数 \(g=id\cdot \varphi\) 即可。前面说到过 \((id\cdot varphi)*id=id_2\),直接杜教筛。

这题还有一个好处,由于 \(g=id\cdot \varphi\),\(g(p^k)=(p-1)p^{2k-1}\),我们可以手算出 \(h(p^k)=(k-1)p^k(p-1)\)。

LOJ6053 简单的函数

题目中 \(f(p^c)=p\oplus c\)。于是 \(f(p)=p\oplus 1\),即在 \(p=2\) 时 \(f(p)=3\),其余时候 \(f(p)=p-1\)。但是这个 \(g\) 的前缀和并不好求。这时候,我们考虑直接令 \(g(p)=\varphi\),并且根据 \(h\) 的定义式修改 \(h\)。这时候的 \(h\) 就不符合只有 PN 处有值的性质了。但是我们发现增加的有值的地方只会是 PN 乘上 \(2\)。所以复杂度仍然正确。

https://loj.ac/s/1764869

标签:frac,cdot,sum,Powerful,mid,varphi,Number,杜教,id
From: https://www.cnblogs.com/TetrisCandy/p/17364886.html

相关文章

  • row_number()over函数的使用(转)
    row_number()over函数的使用(转)      row_number()OVER(PARTITIONBYCOL1ORDERBYCOL2)表示根据COL1分组,在分组内部根据COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).与rownum的区别在于:使用rownum进行排序的时候是先对结果集加......
  • Oracle较长number型数值的科学计数显示
    表中有id列,类型为number,在sqlplus中查询的时候,查询结果的显示方式为科学计数法:ID----------4.5572E+184.5574E+184.5585E+18这样看起来很不直观,而之所以这样显示的原因是在SQL*Plus下,小于等于10位的精度显示的是很直观的形式,大于10位精度的则显示为科学计数的形式。避免......
  • Tablespace 'innodb_system' Page [page id: space=0, page number=5] log sequence n
    场景:这几天在外面实习,老师的项目数据库崩了让我看,连着两条看到十一二点,哎。主要场景是mysql突然崩溃,发现重启mysqld服务无效,重启系统无效。查看/var/log/mysql.log日志,看到以下内容:Themanualpageathttp://dev.mysql.com/doc/mysql/en/crashing.htmlcontainsinfo......
  • 窗口函数DENSE_RANK()/DENSE_RANK()/ROW_NUMBER() 区别
    SQL语句之DENSE_RANK函数:DENSE_RANK()是一个窗口函数,它为分区或结果集中的每一行分配排名,而排名值没有间隙。DENSE_RANK()。如果使用DENSE_RANK()进行排名会得到:1,1,2,3,4。RANK()。如果使用RANK()进行排名会得到:1,1,3,4,5。ROW_NUMBER()。如果使用ROW_NUMBER()进行排名会得到:1,2......
  • CF1699A The Third Three Number Problem
    题意简述构造出一个三元组a,b,c使得(a⊕b)+(a⊕c)+(b⊕c)=n,若无解输出-1。符号⊕的意思为异或个人分析首先要了解异或符号的性质:1,x⊕0=x2,x⊕x=x根据异或符号的性质可以得到一下构造:a=b=0,c=n/2c=0,a=b=n/2通过上述可以发现答案都是偶数所以若n为奇则无解......
  • oracle 分析函数 RANK、DENSE_RANK、ROW_NUMBER
    Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。 Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条......
  • B. Sum of Two Numbers - 贪心+思维+构造
    题意:给定一个整数n,输出x,y满足以下要求:1.x+y=n2.x的每一位上的数加在一起的数位和和y的数位和相差不超过1.分析:从高位开始依次遍历,将其平均分给x和y,奇数剩余的1由x和y轮流加上。代码:#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;......
  • 【学习笔记】杜教筛
    如果我们要求一个积性函数\(f(x)\)的前缀和,可以用杜教筛在\(O(n^{\frac{2}{3}})\)的复杂度求出。具体地,构造函数\(g(x)\)和函数\(h(x)\),使得$h=f*g$,要求的式子是\(S(n)=\sum\limits_{i=1}^{n}f(i)\)。开始推式子。\[\sum\limits_{i=1}^{n}h(i)=\sum\limits_{i=1}^{......
  • [LeetCode] 1342. Number of Steps to Reduce a Number to Zero 将数字变成 0 的操作
    Givenaninteger num,return thenumberofstepstoreduceittozero.Inonestep,ifthecurrentnumberiseven,youhavetodivideitby 2,otherwise,youhavetosubtract 1 fromit.Example1:Input:num=14Output:6Explanation: Step1)14ise......
  • 【vue】error in ./src/components/NumberInfo/NumberInfo.vue
    出现背景:ant designvuepro执行yarnrunserve解决办法:修改src/components/NumberInfo.vue文件中style部分原来的:<stylelang="less"scoped>@import"index";</style>注释掉 @import"index"<stylelang="less"scoped&g......