Powerful Number 筛学习笔记

用途

\(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度。

实现

\(Powerful\ number\) 的定义是每个质因子次数都 \(\ge 2\) 的数。

有如下的性质:

\(1\)、一个 \(Powerful\ number\) 一定可以表示为 \(a^2b^3\) 的形式。

\(2\)、\(n\) 以内的 \(Powerful\ number\) 个数是 \(O(\sqrt n)\) 级别的。

所以找 \(Powerful\ number\) 可以直接暴力 \(dfs\)。

如果要求的函数是 \(f\),那么我们需要找到一个积性函数 \(g\),使得 \(f\) 和 \(g\) 在质数处的取值相同。

同时还要找到一个积性函数 \(h\),使得 \(f=g*h\)。

根据狄利克雷卷积的定义

\(f(p)=g(p)h(1)+g(1)h(p)=g(p)+h(p)=f(p)+h(p)\)。

所以 \(h(p)=0\),因为 \(h\) 是一个积性函数,所以所有非 \(Powerful\ number\) 在 \(h\) 函数中的取值都是 \(0\)。

\(\sum_{i=1}^nf(i)=\sum_{i=1}^n\sum_{d|i}h(d)g(\frac{i}{d})=\sum_{d=1}^nh(d)\sum_{j=1}^{\frac{n}{d}}g(j)\)。

因为 \(h\) 只在 \(Powerful\ number\) 处有值,所以我们只需要求出 \(\sqrt{n}\) 个 \(g\) 函数的前缀和即可。

例题

题目描述

给定一个积性函数 \(f\),满足 \(f(1)=1\),并且对于任意质数 \(p\) 和正整数 \(e\),都有 \(f(p^e)=p^k\),\(k\) 为给定的数,\(n \leq 10^{13},k \leq 20\)。

分析

构造积性函数 \(g\),满足对于任意 \(x\),都有 \(g(x)=x^k\)。

\(f(p^2)=g(p^2)h(1)+g(p)h(p)+g(1)h(p^2)\)。

那么 \(p^{k}=p^{2k}+h(p^2)\),\(h(p^2)=p^{k}-p^{2k}\)。

\(f(p^3)=g(p^3)h(1)+g(p^2)h(p)+g(p)h(p^2)+g(1)h(p^3)\)。

\(p^{k}=p^{3k}+p^k(p^{k}-p^{2k})+h(p^3)\),\(h(p^3)=p^{k}-p^{2k}\)。

多算几项就会发现 \(h(p^e)=p^{k}-p^{2k},e \ge 2\),

直接做就行了。

代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<map>
#define rg register
template<typename T>void read(rg T& x){
x=0;rg int fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
x*=fh;
}
const int maxn=1e7+5,maxm=35,mod=1e9+7;
inline int addmod(rg int now1,rg int now2){
return now1+=now2,now1>=mod?now1-mod:now1;
}
inline int delmod(rg int now1,rg int now2){
return now1-=now2,now1<0?now1+mod:now1;
}
inline int mulmod(rg long long now1,rg int now2){
return now1*=now2,now1>=mod?now1%mod:now1;
}
inline int ksm(rg int ds,rg int zs){
rg int nans=1;
while(zs){
if(zs&1) nans=mulmod(nans,ds);
ds=mulmod(ds,ds);
zs>>=1;
}
return nans;
}
int pri[maxn],k,sqr,b[maxm],c[maxm][maxm],ny[maxm],tot,val[maxn],mi[maxn],ans;
bool not_pri[maxn];
long long n,w[maxn];
void pre(){
for(rg int i=0;i<maxm;i++) c[i][0]=1;
for(rg int i=1;i<maxm;i++){
for(rg int j=1;j<=i;j++){
c[i][j]=addmod(c[i-1][j-1],c[i-1][j]);
}
}
ny[1]=1;
for(rg int i=2;i<maxm;i++) ny[i]=mulmod(mod-mod/i,ny[mod%i]);
b[0]=1;
for(rg int i=1;i<=20;i++){
for(rg int j=0;j<=i-1;j++){
b[i]=addmod(b[i],mulmod(c[i+1][j],b[j]));
}
b[i]=delmod(0,mulmod(b[i],ny[i+1]));
}
}
std::map<int,int> mp;
int getsum(rg int val){
if(mp.find(val)!=mp.end()) return mp[val];
val++;
rg int nans=0,tmp=val;
for(rg int i=k;i>=0;i--){
nans=addmod(nans,mulmod(c[k+1][i],mulmod(b[i],tmp)));
tmp=mulmod(tmp,val);
}
nans=mulmod(nans,ny[k+1]);
return mp[val-1]=nans;
}
void xxs(rg int mmax){
not_pri[0]=not_pri[1]=1;
for(rg int i=2;i<=mmax;i++){
if(!not_pri[i]){
pri[++pri[0]]=i;
mi[pri[0]]=delmod(ksm(i,k),ksm(i,k<<1));
}
for(rg int j=1;j<=pri[0] && i*pri[j]<=mmax;j++){
not_pri[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
void dfs(rg int now,rg long long nw,rg int nval){
w[++tot]=nw,val[tot]=nval;
for(rg int i=now;i<=pri[0] && nw<=n/pri[i]/pri[i];i++){
rg long long tmp=1LL*nw*pri[i];
for(;tmp<=n/pri[i];tmp*=pri[i]) dfs(i+1,tmp*pri[i],mulmod(nval,mi[i]));
}
}
int main(){
pre();
read(n),read(k);
sqr=sqrt(n);
xxs(sqr+5);
dfs(1,1,1);
for(rg int i=1;i<=tot;i++){
ans=addmod(ans,mulmod(val[i],getsum((n/w[i])%mod)));
}
printf("%d\n",ans);
return 0;
}

Powerful Number 筛学习笔记的更多相关文章

  1. Min_25筛 学习笔记

    这儿只是一个简单说明/概括/总结. 原理见这: https://www.cnblogs.com/cjyyb/p/9185093.html https://www.cnblogs.com/zhoushu ...

  2. $Min\_25$筛学习笔记

    \(Min\_25\)筛学习笔记 这种神仙东西不写点东西一下就忘了QAQ 资料和代码出处 资料2 资料3 打死我也不承认参考了yyb的 \(Min\_25\)筛可以干嘛?下文中未特殊说明\(P\)均指 ...

  3. [笔记] Powerful Number 筛

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

  4. Min_25 筛 学习笔记

    原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...

  5. 洲阁筛 & min_25筛学习笔记

    洲阁筛 给定一个积性函数$F(n)$,求$\sum_{i = 1}^{n}F(n)$.并且$F(n)$满足在素数和素数次幂的时候易于计算. 显然有: $\sum_{i = 1}^{n} F(n) = ...

  6. Min_25筛学习笔记

    感觉好好用啊 Luogu上的杜教筛模版题一发 Min_25抢到了 rank1 $ Updated \ on 11.29 $被 STO txc ORZ踩爆啦 前言 $ Min$_$25$筛可以求积性函数 ...

  7. min-25筛学习笔记

    Min_25筛简介 \(\text{min_25}\)筛是一种处理一类积性函数前缀和的算法. 其中这类函数\(f(x)\)要满足\(\sum_{i=1}^{n}[i\in prime]\cdot f( ...

  8. min_25筛学习笔记【待填坑】

    看见ntf和pb两位大佬都来学了,然后就不自觉的来学了. 我们考虑这样一个问题. $$ans=\sum_{i=1}^nf(i)$$其中$1\leq n\leq 10^{10}$ 其中$f(i)$是一个 ...

  9. 莫比乌斯反演/线性筛/积性函数/杜教筛/min25筛 学习笔记

    最近重新系统地学了下这几个知识点,以前没发现他们的联系,这次总结一下. 莫比乌斯反演入门:https://blog.csdn.net/litble/article/details/72804050 线 ...

随机推荐

  1. TypeScript constructor public cause duplicate bug

    TypeScript constructor public cause duplicate bug constructor public const log = console.log; // con ...

  2. Publish/Subscribe Pattern & Vanilla JavaScript

    Publish/Subscribe Pattern & Vanilla JavaScript https://en.wikipedia.org/wiki/Publish–subscribe_p ...

  3. what's the print number means after called the setTimeout function in Chrome console?

    what's the print number means after called the setTimeout function in Chrome console? javascript fun ...

  4. CSS3 & gradient & color & background

    CSS3 & gradient & color & background css background https://developer.mozilla.org/en-US/ ...

  5. js operate svg

    js operate svg js dynamic create svg https://stackoverflow.com/questions/20539196/creating-svg-eleme ...

  6. 谷歌地球服务器"失联"的替代方案

    2020年11月下旬,谷歌地球开始无法连接.作为谷歌地球的替代方案,推荐使用国产软件"图新地球LSV".网址 http://www.tuxingis.com 下载"图新地 ...

  7. JMM内存模型相关笔记整理

    JMM 内存模型是围绕并发编程中原子性.可见性.有序性三个特征来建立的 原子性:就是说一个操作不能被打断,要么执行完要么不执行,类似事务操作,Java 基本类型数据的访问大都是原子操作,long 和 ...

  8. Java中print、printf、println的区别

    Java中print.printf.println的区别 区别 print:标准输出,但不换行,不可以空参: println:标准输出,但会自动换行,可以空参,可以看做:println()相当于pri ...

  9. C++算法代码——标题统计

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=2327 题目描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意: ...

  10. sublime 使用过程中遇到的问题

    1.当我把鼠标放置在下图所示的class上几秒钟后,sublime就会在全局查找当前的class字符,这时sublime就会出现卡顿或无响应 解决方法: 点击preferences下的settings ...