心血来潮跑来实现以下这个东西

我们应该知道杜教筛的理论是 \(f * g=h\),那么问题在于如何找 \(g\)。

之前的blog应该提到过可以令 \(g(p)=-f(p)\),这样一来 \(h\) 就只会在PN处有值。于是可以大力爆搜 \(h\),而 \(g\) 的块筛又很好处理。

但是这样复杂度会有一个下限为 \(O(n^{\frac 2 3})\),有没有办法去除呢?

办法是有的,反过来,设 \(h * g=f\)。

此时我们构造 \(g(p)=f(p)\) 即可得到和上面相同的结论,但此时只需处理 \(g\) 的块筛即可,复杂度下降至 \(O(\frac{n^{\frac 3 4}}{\log n})\) 或者更低。

问题来了,当 \(k>2\) 时,\(g(p^k)\) 应该是多少?

实际上是多少否无所谓,因为有 \(\sum_{i=0}^k h(p^i)g(p^{k-i})=f(p^k)\),一般情况令 \(g(p^k)=0\)。

但是我在实现的时候 推 错 了 \(g\) 的 块 筛 柿 子,懒得重新推。又发现我的柿子实际上是令 \(g(p^k)=f(p)^k\),如果直接暴力做卷积那么复杂度会变成 \(O(\sqrt n\log n)\),于是来优化一下:

\[\sum_{i=0}^kh(p^i)f(p)^{k-i}=f(p^k)
\]
\[f(p)^k\sum_{i=0}^kh(p^i)f(p)^{-i}=f(p^k)
\]

于是处理出 \(\frac{f(p^k)}{f(p)^k}\),然后来个差分求逆元就好,复杂度变回了 \(O(\sqrt n)\),不过需要存在逆元才行。

但是?

\[h(p^k)f(p)^{-k}=\frac{f(p^k)}{f(p)^k}-\frac{f(p^{k-1})}{f(p)^{k-1}}
\]
\[h(p^k)=f(p^k)-f(p^{k-1})f(p)
\]

不需要逆元也可以。

这里丢一下 DIVCNTK 的实现,目前是 lgrk2,spojrk7:

#include<cstdio>
#include<cmath>
typedef unsigned ui;
typedef __uint128_t L;
typedef unsigned long long ull;
const ui M=1e5+5;
ull n,K,h[M],F[M],G[M],f0[M],g0[M];L B[M];ui S,top,pri[M];
ull DFS(const ull&n,const ui&k){
ull ans=n<=S?G[n]+1:F[::n/n]+1;
for(ui i=k+1;i<=top&&1ull*pri[i]*pri[i]<=n;++i){
ull*H=h+2;
for(ull N=(n*B[pri[i]]>>64)*B[pri[i]]>>64;N;N=N*B[pri[i]]>>64){
ans+=*H++*DFS(N,i);
}
}
return ans;
}
inline ull PN(const ull&n){
ui i,j,k,tp=0,sqr;ull w,lim;top=0;
for(S=1;1ull*S*S<=n;++S)f0[S]=(n*B[S]>>64)-1,g0[S]=S-1;
sqr=sqrt(--S);
for(i=2;i<=S;++i)if(g0[i]^g0[i-1]){
w=n*B[i]>>64;lim=w*B[i]>>64;if(lim>S)lim=S;k=S*B[i]>>64;++tp;
const ull&S0=g0[i-1];
for(j=1;j<=k;++j)f0[j]-=f0[i*j]-S0;
for(;j<=lim;++j)f0[j]-=g0[w*B[j]>>64]-S0;
if(i<=sqr){
for(lim=k*i,j=S;k>=i;lim-=i,--k){
for(const ull&V0=g0[k]-S0;j>=lim;--j)g0[j]-=V0;
}
}
}
for(i=1;i<=S;++i)F[i]=f0[i]*K,G[i]=g0[i]*K;top=tp++;
for(i=S;i>1;--i)if(g0[i]^g0[i-1]){
const ull&g=g0[i-1]*K;
if(i<=sqr){
for(k=i,lim=(k+1)*i,j=lim-i;lim<=S;lim+=i,++k){
for(const ull&V=K*(G[k]-g);j<lim;++j)G[j]+=V;
}
for(const ull&V=K*(G[k]-g);j<=S;++j)G[j]+=V;
}
w=n*B[i]>>64;lim=w*B[i]>>64;if(lim>S)lim=S;k=S*B[i]>>64;pri[--tp]=i;
for(j=lim;j>k;--j)F[j]+=K*(G[w*B[j]>>64]-g);
for(j=k;j>=1;--j)F[j]+=K*(F[i*j]-g);
}
lim=log(n)/log(2);K=(K-1)*(K-1);
for(i=1;i<=lim;++i)h[i]=-K*(i-1);
return DFS(n,0);
}
signed main(){
ui T;for(T=1;T<M;++T)B[T]=((L(1)<<64)+T-1)/T;scanf("%u",&T);
while(T--)scanf("%llu%llu",&n,&K),++K,printf("%llu\n",PN(n));
}

powerful number筛的更多相关文章

  1. Powerful Number 筛学习笔记

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

  2. [笔记] Powerful Number 筛

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

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

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

  4. Note - Powerful Number

    Powerful Number   对于 \(n\in\mathbb N_+\),若不存在素数 \(p\) 使得 \(p\mid n~\land~p^2\not\mid n\),则称 \(n\) 为 ...

  5. Powerful Number 筛法

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

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

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

  7. Powerful Number 学习笔记

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

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

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

  9. 筛 sigma_k

    问题 定义 \(\sigma_k(n)\) 表示 \(n\) 的所有约数的 \(k\) 次方和,即 \[\sigma_k(n)=\sum_{d\mid n}d^k \] 问题:求 \(\sigma_k ...

随机推荐

  1. JAVA 变量的概述

    变量的概述         用于存储可变数据的容器. 变量存在的意义 计算机主要用于处理生活中的数据,由于生活中存在大量的可变数据,那么计算机就必须具备存储可变数据的能力. 比如: 1.时间每一秒都在 ...

  2. Java微信公众号服务器配置-验证Token

    一.填写服务器配置 首先我们需要在微信公众平台上填写服务器配置 重点内容    服务器地址URL(一定要外网能访问的到)        在我们提交配置的时候,微信会发送GET请求到URL上,      ...

  3. Spring Cloud 源码分析之OpenFeign

    OpenFeign是一个远程客户端请求代理,它的基本作用是让开发者能够以面向接口的方式来实现远程调用,从而屏蔽底层通信的复杂性,它的具体原理如下图所示. 在今天的内容中,我们需要详细分析OpenFei ...

  4. AppiumForMac安装2

    安装了两天的Python和Appium,各种不成功,到现在还不知道要怎么才能使用,两者之间的关联性还是没找到. 虽然很乱,还是把这期间用到的知识汇总下: 1.爬墙很重要,下载东西慢的很. 2.最新的M ...

  5. Spring Boot 2.x基础教程:使用tinylog记录日志

    tinylog简介 tinylog,与其他各种tiny开头的东西一样,是一个轻量级的开源日志解决方案.它本身只包含两个JAR文件(一个用于API,另一个用于实现),没有任何外部依赖关系.两个JAR文件 ...

  6. 框架5--nginx安装部署 下(web服务)

    目录 1.提纲 2.Nginx虚拟主机 3.Nginx日志 4.Nginx访问控制模块 5.Nginx状态监控模块 6.访问连接控制模块 框架5--nginx安装部署 下(web服务) 1.提纲 1. ...

  7. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  8. 使用IWebBrowser2操控浏览器页面测试(IE)

      测试一下在IE浏览器界面中插入代码测试,采用寻找窗口的方式获取Internet Explorer_Server句柄.   写的时候参考了很多网上的资料,有些地方不大适用就稍微修改了一下. Send ...

  9. html特殊字符(css3 content)

    由于偶尔用到,又经常忘记,所以把网上的资料考下来记录一下. <!DOCTYPE html> <html lang="en"> <head> &l ...

  10. 十一讲/十二讲 最近总是学不进去,这咋办啊 哭了我i我i我i

    0: 2,9,7      错错错 帽号回来是列表 1:好像一样?   错错错  不一样,list[0]是一个值,冒号回来是个列表 2:A.insert(0,A[-1]) del A[-1]      ...