用途

快速($O(\frac{n^{3/4}}{logn})$)地计算一些函数f的前缀和,以及(作为中间结果的)只计算质数的前缀和

一般要求$f(p)$是积性函数,$f(p)$是多项式的形式,且$f(p^k)$可以快速计算

做法

首先考虑求出范围内的质数的取值的和

如果有$f(p)=\sum{a_ip^i}$

那么我们构造$h_i(x)=x^i$,不难发现$h_i$是完全积性的

就是说,把f在质数的时候的式子拆开,然后让它在不是质数的时候也成立

考虑求其中的一个h,接下来设$pri_j$是第j个质数

设$g(n,j)=\sum\limits_{i=1}^{n}[i \in Prime OR min\_divisor(i)>pri_j]h(i)$,即n范围内质数或者最小质因数$>pri_j$的h值之和

可以当成是埃氏筛法的过程,已经筛掉了前j个质数

那么$g(n,inf)$就是要求的质数的和,g(n,0)就是所有数(1以外的)的h的和

(关于计算g(n,0),次数要是小的话可以直接代公式,大的话就要斯特林数或者别的什么来求自然数幂和了..不过别忘了减掉1)

考虑转移,有:

$g(n,j)=g(n,j-1) , pri_j*pri_j>n$

$g(n,j)=g(n,j-1)-h(pri_j)(g(\lfloor\frac{n}{pri_j}\rfloor,j-1)-\sum\limits_{i=1}^{j-1}h(pri_i)) , pri_j*pri_j<=n$

考虑$pri_j*pri_j<=n$的情况,它在从$g(n,j-1)$转移过来的时候,需要减掉那些最小质因子是$pri_j$的,而h又是完全积性的,所以可以直接乘。但这样减会多减掉那些比$pri_j$小的质数乘$pri_j$,需要再加回来

于是我们就求出来质数的h的和啦!然而这有什么卵用呢..

设$S(n,j)=\sum\limits_{i=1}^{n}[min\_divisor(i)>=pri_j]f(i)$,那么$S(N,1)+f(1)$就是要求的答案

考虑转移,有$S(n,j)=\sum a_ig_i(n,inf) - \sum\limits_{i=1}^{j-1}f(pri_i) + \sum\limits_{k=j}^{pri_k*pri_k<=n}\sum\limits_{e=1}^{pri_k^{e+1}<=n}f(pri_k^e)S(\lfloor \frac{n}{pri_k^e} \rfloor,k+1)+f(pri_k^{e+1})$

就是说,既然我们已经求出了质数的情况,那就先把符合要求的质数加上,然后再加上合数,枚举它的质因子然后都除下去就好了(因为这里已经没有完全积性了,所以一次要把某个质因子都除掉),因为S里是没有1的,所以还要额外加上$p^{e+1}$的情况

例题

loj6053 简单的函数

注意到除了f(2)=3以外,f(p)=p-1

于是拆成p和1去做即可。最后算S的时候,如果j<=1,那再加个2

 #include<bits/stdc++.h>
#include<tr1/unordered_map>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=1e6+,P=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int pri[maxn],sump[maxn],cnt,tot,sqrtn;
bool np[maxn];
ll N,w[maxn];
tr1::unordered_map<ll,int> id;
int g[maxn],h[maxn]; inline int S(ll n,int j){
if(n<=||pri[j]>n) return ;
int re=(0ll+g[id[n]]-h[id[n]]-sump[j-]+j-)%P;
if(j==) re=(re+)%P;
for(int i=j;i<=cnt&&1ll*pri[i]*pri[i]<=n;i++){
ll tmp=pri[i];
for(int k=;tmp*pri[i]<=n;k++){
re=(re+1ll*S(n/tmp,i+)*(pri[i]^k)+(pri[i]^(k+)))%P;
tmp=tmp*pri[i];
}
}return re;
} int main(){
//freopen("","r",stdin);
ll i,j;
N=rd();sqrtn=sqrt(N);
for(i=;i<=sqrtn;i++){
if(!np[i]){
pri[++cnt]=i;
sump[cnt]=(sump[cnt-]+i)%P;
}
for(j=;j<=cnt&&pri[j]*i<=sqrtn;j++){
np[pri[j]*i]=;
if(i%pri[j]==) break;
}
}
for(i=;i<=N;i=j+){
j=N/(N/i);
w[++tot]=N/i;id[w[tot]]=tot;
g[tot]=1ll*(w[tot]+)%P*((w[tot]-)%P)%P;
if(g[tot]&) g[tot]+=P;
g[tot]=g[tot]/%P;
h[tot]=(w[tot]-)%P;
}
for(j=;j<=cnt;j++){
for(i=;i<=tot&&1ll*pri[j]*pri[j]<=w[i];i++){
g[i]=(g[i]-1ll*pri[j]*(g[id[w[i]/pri[j]]]-sump[j-]))%P;
h[i]=(0ll+h[i]-(h[id[w[i]/pri[j]]]-j+))%P;
}
}
printf("%d\n",((S(N,)+)%P+P)%P); return ;
}

[模板]Min_25筛的更多相关文章

  1. LG5325 【模板】Min_25筛

    P5325 [模板]Min_25筛 题目背景 模板题,无背景. 题目描述 定义积性函数$f(x)$,且$f(p^k)=p^k(p^k-1)$($p$是一个质数),求 $$\sum_{i=1}^n f( ...

  2. P4213 【模板】杜教筛(Sum) min_25筛

    \(\color{#0066ff}{ 题目描述 }\) 给定一个正整数\(N(N\le2^{31}-1)\) 求 \(ans_1=\sum_{i=1}^n\varphi(i)\) \(ans_2=\s ...

  3. 模板 - 数学 - 数论 - Min_25筛

    终于知道发明者的正确的名字了,是Min_25,这个筛法速度为亚线性的\(O(\frac{n^{\frac{3}{4}}}{\log x})\),用于求解具有下面性质的积性函数的前缀和: 在 \(p\) ...

  4. Min_25 筛 学习笔记

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

  5. 【SPOJ】DIVCNTK min_25筛

    题目大意 给你 \(n,k\),求 \[ S_k(n)=\sum_{i=1}^n\sigma_0(i^k) \] 对 \(2^{64}\) 取模. 题解 一个min_25筛模板题. 令 \(f(n)= ...

  6. 关于min_25筛的一些理解

    关于min_25筛的一些理解 如果想看如何筛个普通积性函数啥的,就别往下看了,下面没有的(QwQ). 下文中,所有的\(p\)都代表质数,\(P\)代表质数集合. 注意下文中定义的最小/最大质因子都是 ...

  7. LOJ6625 时间复杂度(min_25筛)

    本人在LOJ的第三题(前两题太水不好意思说了QwQ),欢迎大家踩std. 题目链接:LOJ 题目大意:定义函数 $f$:($minp$ 表示最小质因子) $$f(x)=\begin{cases}0&a ...

  8. Min_25筛 学习小记

    前言 为什么叫学习小记呢?因为暂时除了模板题就没有做其他的东西了.(雾 这个东西折磨了我一整天,看得我身不如死,只好结合代码理解题解,差点死在机房.(话说半天综合半天竞赛真是害人不浅) 为了以后忘了再 ...

  9. Min_25 筛与杜教筛

    杜教筛 \(\) 是 \(\) 的前缀和,\(\), \(\) 同理. 假设 \( × = ℎ\) ,并且 \(, \) 易求出,\(\) 难求出. 那么 \[H () = \sum_{ \cdot ...

随机推荐

  1. SQLServer之修改表值函数

    修改表值函数注意事项 更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数.存储过程或触发器. 不能用 A ...

  2. IOS开发protocol使用

    1.什么是protocol? protocol(协议)是用来定义对象的属性和行为,用于回调. 2.protocol分类? 协议中有三个修饰关键字@required和@optional和@propert ...

  3. 使用C++对物理网卡/虚拟网卡进行识别(包含内外网筛选)

    简介 在Socket编程的时候,我们需要实时获取我们所需要的IP地址.例如在编写后门的时候,我们可能需要获得有效的外网IP或内网IP:有时候我们可能需要判断我们获取的是否是虚拟机网卡,这时候就需要对每 ...

  4. LeetCode算法题-Merge Two Binary Trees(Java实现)

    这是悦乐书的第274次更新,第290篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第142题(顺位题号是617).提供两个二叉树,将其合并为新的二叉树,也可以在其中一个二 ...

  5. MySQL 数据库的创建&修改

    -- 创建数据库 CREATE DATABASE [IF NOT EXISTS]<数据库名> DEFAULT CHARACTER SET utf8; -- 默认字符集为utf8 -- 指定 ...

  6. 【笔记】Python集成开发环境——PyCharm 2018.3下载、注册、帮助文档

    [博客导航] [Python导航] 前言 使用好的开发环境将有效提高编程效率,在Python使用上我是小白,所以特意请教了从事语言处理的成同学,告知我,推荐使用Pycharm和IntelliJ. 目前 ...

  7. const关键字到底该怎么用

    原文地址:https://www.yanbinghu.com/2019/01/28/7442.html 前言 我们都知道使用const关键字限定一个变量为只读,但它是真正意义上的只读吗?实际中又该如何 ...

  8. virtualenvwrapper 虚拟环境的使用 和 python 安装源的更改

    virtualenvwrapper 虚拟环境的使用 鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper. virtualenvwrapper提供了一系 ...

  9. 【Python 18】BMR计算器2.0(数值类型转换与while循环)

    1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...

  10. SpringBoot学习笔记(2) Spring Boot的一些配置

    外部配置 Spring Boot允许使用properties文件.yaml文件或者命令行参数作为外部配置 使用@Value注解,可以直接将属性值注入到你的beans中,并通过Spring的Enviro ...