Powerful Number

  对于 \(n\in\mathbb N_+\),若不存在素数 \(p\) 使得 \(p\mid n~\land~p^2\not\mid n\),则称 \(n\) 为 Powerful Number。即,\(n\) 的每个素因子至少以二次的形式存在。不难发现,任何一个 Powerful Number \(n\) 都可以写成 \(a^2b^3~(a,b\in\mathbb N_+)\) 的形式(但不唯一)。接下来,我们研究其在正整数前缀序列中出现次数的规模,有

\[\begin{aligned}
\sum_{i=1}^n[i\text{ is a P.N.}]&\le\sum_{i=1}^n\left(\frac{n}{i^2}\right)^{\frac{1}{3}}\\
&=n^{\frac{1}{3}}\sum_{i=1}^ni^{-\frac{2}{3}}\\
&\le n^{\frac{1}{3}}\int_1^nx^{-\frac{2}{3}}\text dx\\
&=n^{\frac{1}{3}}\left.\left(3x^{\frac{1}{3}}\right)\right|_1^{n^{\frac{1}{2}}}\\
&=\mathcal O(n^\frac{1}{2})
\end{aligned}
\]

所以 \(n\) 以内的 Powerful Number 的数量是 \(\mathcal O(\sqrt n)\) 级别,因此引出了基于 Powerful Number 数量的神奇筛法。

Powerful Number 筛法

  给出任意的积性函数 \(f\),求

\[\sum_{i=1}^nf(i)
\]

  若按照正常杜教筛的方法,我们很可能无法找到一个 \(g\) 使得 \(f\star g\) 的前缀和易于计算。我们转而引入一个在素数处“拟合” \(f\) 的积性函数 \(g\),即有

\[\forall p\in\mathbb P,~g(p)=f(p)
\]

同时保证 \(g\) 的前缀和易于计算。接着构造出类似杜教筛的卷积形式,令

\[h=f\star g^{-1}
\]

那么

\[\sum_{i=1}^nf(i)=\sum_{i=1}^nh(i)\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor} g(j)
\]

  有何特别之处呢?考虑任意素数 \(p\):

\[f(p)=g(p)+h(p)=g(p)~~~~\Rightarrow~~~~h(p)=0
\]

而 \(g\),\(f=g\star h\) 均为积性函数,所以 \(h\) 为积性函数,况且 \(h(p)\) 恒为 \(0\),所以使得 \(h(a)\not=0\) 的 \(a\) 为 Powerful Number!我们只需要预处理出 \(\mathcal O(\sqrt n)\) 个 \(g\) 的前缀和,再大力搜索不为 \(0\) 的 \(h(a)\),就能算出上式的结果啦!

例题

「LOJ #6053」简单的函数

  Link.

  积性函数 \(f\) 满足 \(f(p^c)=p\oplus c~(p\in\mathbb P,c\in\mathbb N_+)\),求 \(\sum_{i=1}^n f(i)\bmod(10^9+7)\)。

  \(n\le10^{10}\)。


  首先,考虑 \(f\) 的素数点值:

\[f(p)=\begin{cases}
3,&p=2\\
p-1,&\text{otherwise}
\end{cases}
\]

由 \(p-1\) 联想到 \(\varphi(p)=p-1\),可惜 \(\varphi(2)=1\)。干脆一点,我们直接强行把 \(\varphi\) 的偶数点值乘上 \(3\),令

\[g(n)=\begin{cases}
\varphi(n),&2\not\mid n\\
3\varphi(n),&\text{otherwise}
\end{cases}
\]

显然它也是积性函数。

  接着,求 \(g\) 的前缀和。其前缀和为 \(\varphi\) 的前缀和加上两倍偶数点的 \(\varphi\) 前缀和。记

\[\begin{aligned}
S(n)&=\sum_{i=1}^n\varphi(2i)\\
&=\sum_{i=1}^n[2\not\mid i]\varphi(i)+2\sum_{i=1}^n[2\mid i]\varphi(i)\\
&=S\left(\frac{n}{2}\right)+\sum_{i=1}^n\varphi(i)
\end{aligned}
\]

杜教筛处理 \(\varphi\) 的前缀,\(S\) 就能在可观(我不会算 qwq)的复杂度内预处理出来,继而也得到了 \(g\) 的 \(\mathcal O(\sqrt n)\) 个前缀和。

  此外,我们还需要求 \(h(i)\),即求 \(h(p^c)~(c>1)\)。考虑 \(f(p^c)\) 与它的关系:

\[f(p^c)=\sum_{i=0}^ch(p^i)g(p^{c-i})\\
\Rightarrow~~~~h(p^c)=f(p^c)-\sum_{i=0}^{c-1}h(p^i)g(p^{c-i})
\]

顺手把 \(\mathcal O(\sqrt n\ln\ln\sqrt n)\)(\(n\) 以内素数的倒数和的规模是 \(\mathcal O(\ln\ln n)\))个 \(h(p^c)\) 也预处理出来,最后 \(\mathcal O(\sqrt n)\) 搜索 Powerful Number 就能求出答案啦!

  代码可见我的博客

「洛谷 P5325」Min_25 筛

  Link.

  对于积性函数 \(f(x)\),有 \(f(p^k)=p^k(p^k-1)~(p\in\mathbb P,k\in\mathbb N_+)\)。求 \(\sum_{i=1}^nf(i)\bmod(10^9+7)\)。

  \(n\le10^{10}\)。


  Min_25 筛是不可能的。

  Powerful Number 三步走咯!考虑素数点值:

\[f(p)=p^2-p
\]

那么令 \(g=\operatorname{id}\cdot\varphi\)(点乘号即数值相乘),就有 \(g(p)=p^2-p\)。积性函数的点乘亦为积性函数。

  求 \(g\) 的前缀和,杜教筛基础操作,卷上一个 \(\operatorname{id}\):

\[\begin{aligned}
\lbrack(\operatorname{id}\cdot\varphi)\star\operatorname{id}\rbrack(n)&=\sum_{i\mid n}(\operatorname{id}\cdot\varphi)(i)\cdot\frac{n}{i}\\
&=\sum_{i\mid n}n\varphi(i)\\
&=n^2
\end{aligned}
\]

自然数平方和易求,丢到杜教筛的式子里,推导后得出

\[S(n)=\frac{n(n+1)(2n+1)}{6}-\sum_{i=2}^niS\left(\lfloor\frac{n}{i}\rfloor\right)
\]

其中 \(S(n)\) 即为 \(\sum_{i=1}^ng(i)\)。

  求 \(h(p^k)\),可以用 Bell 级数推导。令 \(F_p,G_p,H_p\) 分别为 \(f,g,h\) 在某一素数 \(p\) 的 Bell 级数,则

\[\begin{cases}
F_p=\operatorname{OGF}\langle1,p(p-1),p^2(p^2-1),\cdots\rangle=\frac{1}{1-p^2z}-\frac{1}{1-pz}+1\\
G_p=\operatorname{OGF}\langle1,p(p-1),p^3(p-1),\cdots\rangle=\frac{1-pz}{1-p^2z}
\end{cases}
\]

应用“两函数 Bell 级数的乘法卷积”为“原函数 Dirichlet 卷积之 Bell 级数”的性质,得到

\[\begin{aligned}
H_p&=\frac{F_p}{G_p}\\
&=\frac{\frac{1}{1-p^2z}-\frac{1}{1-pz}+1}{\frac{1-pz}{1-p^2z}}\\
&=\frac{1-\frac{1-p^2z}{1-pz}+1-p^2z}{1-pz}\\
&=\frac{1}{1-pz}-\frac{1-p^2z}{(1-pz)^2}+\frac{1-p^2z}{1-pz}\\
\end{aligned}
\]

我们仅仅想求 \(h(p^k)\),即 \([z^k]H_p\),那么

\[\begin{aligned}
\lbrack z^k\rbrack H_p&=[z^k]\frac{1}{1-pz}-[z^k]\frac{1-p^2z}{(1-pz)^2}-[z^k]\frac{1-p^2z}{1-pz}\\
&=p^k-[(k+1)p^k-kp^{k+1}]+(p^k-p^{k+1})\\
&=(k-1)(p^{k+1}-p^k)
\end{aligned}
\]

  最终,\(\mathcal O(n^{\frac{2}{3}})\) 就能求出答案啦。

  代码可见我的博客

总结

  • Powerful Number 指每个素因子至少是二次的正整数;
  • \([1,n]\) 内的 Powerful Number 个数为 \(\mathcal O(\sqrt n)\);
  • Powerful Number 筛法的步骤为:
    1. 对于 \(f\),找到素数点值与其相同的,方便求前缀和的函数 \(g\);
    2. 预处理/在线求 \(g\) 的 \(\mathcal O(\sqrt n)\) 个前缀和;
    3. 预处理/在线求 \((f\star g^{-1})(p^k)\),可以暴力计算或尝试 Bell 级数;
    4. 爆搜 Powerful Number 统计答案。
  • 此筛法是否优秀大部分取决于第三步,即能否快速计算 \((f\star g^{-1})(p^k)\)。

Note - Powerful Number的更多相关文章

  1. 利用powerful number求积性函数前缀和

    好久没更博客了,先水一篇再说.其实这个做法应该算是杜教筛的一个拓展. powerful number的定义是每个质因子次数都 $\geq 2$ 的数.首先,$\leq n$ 的powerful num ...

  2. powerful number求积性函数前缀和

    算法原理 本文参考了 zzq's blog . \(\text{powerful number}\) 的定义是每个质因子次数都 \(\ge 2\) 的数,有个结论是 \(\ge n\) 的 \(\te ...

  3. Powerful Number 筛学习笔记

    Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...

  4. Powerful Number 学习笔记

    定义 对于一个正整数 \(n\) ,若完全分解之后不存在指数 \(=1\) ,则称 \(n\) 为 \(\text{Powerful Number}\) . 可以发现的是,在 \([1,n]\) 中, ...

  5. [笔记] Powerful Number 筛

    定义 Powerful Number(以下简称 PN)筛类似于杜教筛,可以拿来求一些积性函数的前缀和. 要求: 假设现在要求积性函数 \(f\) 的前缀和 \(F(n)=\sum_{i=1}^nf(i ...

  6. Powerful Number 筛法

    我也不想学筛法了,可你考试时候出一个新筛法就不厚道了吧,我还开始以为这是杜教筛... $tips:$学完杜教筛立马学$Powerful \ Number$筛法,此筛法强悍如斯 $Powerful \ ...

  7. 【HDOJ6623】Minimal Power of Prime(Powerful Number)

    题意:给定大整数n,求其质因数分解的最小质数幂 n<=1e18 思路:常规分解算法肯定不行 考虑答案大于1的情况只有3种:质数的完全平方,质数的完全立方,以及p^2*q^3,p,q>=1三 ...

  8. powerful number筛

    心血来潮跑来实现以下这个东西 我们应该知道杜教筛的理论是 \(f * g=h\),那么问题在于如何找 \(g\). 之前的blog应该提到过可以令 \(g(p)=-f(p)\),这样一来 \(h\) ...

  9. leetcode bugfree note

    463. Island Perimeterhttps://leetcode.com/problems/island-perimeter/就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的 ...

随机推荐

  1. Centos 修改环境变量

    环境变量文件路径 添加一个X变量,在etc/profile 尾部添加 X=12345即可 输入命令 vim /etc/profile 变量生效 source /etc/profile 测试结果

  2. iview在ie9及以上的兼容问题解决方案

    兼容requestAnimationFrame let lastTime = 0 let vendors = ['ms', 'moz', 'webkit', 'o'] for (let x = 0; ...

  3. lvgl移植—Linux fbdev&evdev(基于LVGL v7)

    虽然lvgl官方提供了有关linux framebuffer操作的库函数,但是我决定自己试一下能否自己实现这部分操作 实际项目中应优先采用官方库函数,官方实现代码位于文件夹lv_drivers/dis ...

  4. 【golang学习记录】环境搭建

    [golang学习记录]环境搭建 一. 概述 本文是[golang学习记录]系列文章的第一篇,安装Go语言及搭建Go语言开发环境,接下来将详细记录自己学习 go 语言的过程,一方面是为了巩固自己学到的 ...

  5. 《剑指offer》面试题60. n个骰子的点数

    问题描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i ...

  6. json 转换C# class(用于对接api

    //说明//使用场景:对接api,返回json结果,直接转换C# class//如何使用:复制下面js代码在浏览器控制台执行 ` "order_item_id": "28 ...

  7. 【采坑小计】prometheus的remote write协议遇到的问题

    没有读懂源码以前,无脑试错总是效率很低的! 1.thanos receiver报store locally for endpoint : conflict 接口返回的日志: store locally ...

  8. vue操作dom元素

    传统的方法获取dom元素操作dom,通常是获取类名,id,属性等来获取到dom,但在vue中获取组件dom的话会有问题,请看下面代码: 控制台打印出来的结果如下,你会发现正常标签可以正常显示,但是组件 ...

  9. golang中的go get命令

    ### 下载指定版本 go get k8s.io/klog@v1.0.0 go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装. 这个命令在内部实际上分成了两 ...

  10. K8S的安装部署以及基础知识

    Kubernetes(K8S)概述 Kubernetes又称作k8s,是Google在2014年发布的一个开源项目. 最初Google开发了一个叫Borg的系统(现在命名为Omega),来调度近20多 ...