[算法]Min_25筛
前言
本篇文章中使用的字母\(p\),指\(\text{任意的} p \in \text{素数集合}\)
应用场景
若函数\(f(x)\)满足,
- \(f(x)\)是积性函数
- \(f(p)\)可以使用多项式表示。
- 已知\(f(p)\),要能在常数级的时间内计算\(f(p^x),x \in N^+\)。
Min_25筛可以在\(\Theta(\frac{n^{\frac{3}{4}}}{log_2n})\)的时间复杂度内计算\(f(x)\)的前缀和
或者说\(\Theta(n ^ {1 - \epsilon})\)?个人倾向上面那种。
算法
分类
\]
prime指素数集合
辅助函数\(g(x,y)\)的构造与递推
首先线性筛出质数,线性筛就不多说了(如果您线性筛都不会建议先去学习基础算法)
我们从小到大设\(p_i\)为从小到大排列的第i个质数
例如,\(p_1=2,p_2=3,\dots\)
设素数集合为prime,i的最小质因子为\(MPF_i\) (minimal prime fact of i)。
\(||\)为或者,即\(or\); \([a]\)表示a成立是为\(1\),否则为\(0\)
设函数\(g(x,y)\),使得
\]
考虑埃拉托斯特尼筛法,每次选出一个质数,筛掉它的倍数。
注:埃拉托斯特尼筛法的百度百科
我们发现\(g(x,y)\)有一个神奇的性质,我们的\(g(x,y)\)就是\([1,x]\)运行y次筛法以后剩余所有数之和加上所有的\(f(p),p<x\)的和。
我们所求的(prime为质数集合)
\]
实际上等同于\(g(x,|prime|)\),|prime|表示\([1,x]\)之内的质数集合的大小。
首先我们要了解\(g(x,y)\)的初值
\(g(x,0)\)表示所有数的和,也就是把所有数带入\(f(x)\)计算出的结果。
那么接下来就是\(g(x,y)\)的递推了。
- \(p_y^2 > x\)。 此时埃筛的第\(j\)次没有筛去任何质数(理论上第\(y\)次应该筛掉的最小质数为\(p_y^2\)),所以\(g(x,y)=g(x,y-1)\)
- \(p_y^2 \leq x\)。此时埃筛筛去了所有大于\(p_y\)倍的\(p_y\)的倍数,若我们从\(g(x,y-1)\)递推,显然有多计算的部分,该部分就是
\]
表示成公式就是:
\]
前缀函数\(S(x,y)\)的构造与递推
好了现在我们已经有了一个辅助函数\(g(x,y)\),但这玩意貌似一点用都没有....
我们设
\]
讲人话就是所有最小质因子大于等于\(p_j\)的\(f\)值之和。
如果我们要求\(\sum f(i),i \in [1,n]\),我们要求的东西是
\]
鉴于所有质数对答案的贡献我们已经完成计算,它的贡献是
\]
(我们要保证最小质因子大于等于\(p_j\)所以要把小于它的质数减去)
考虑合数对答案的贡献,枚举合数的最小质因子和它的出现次数,然后直接计算。
合数对答案的贡献是:
\]
总结起来就是
\]
\(prime\)指素数集合,\(||\)表示取当前的最大质因子。
复杂度比较

借用一下WC2019课件中的一张图片
例题
[LOJ6053]简单的函数
代码
#include <cstdio>
#include <cmath>
#define ll long long
#define MAXN 1000005
#define MOD 1000000007
long long sqrtn;
ll read(){
ll x = 0; int zf = 1; char ch = ' ';
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;
}
// the number n, cac the sum of f(i) i belongs to [1, n]
ll n;
// primes number of primes in total
ll p[MAXN], pcnt;
// g is the function g, the sum of the f(prime).
ll g[MAXN];
// the number of the prime less the pn_i
ll pn[MAXN];
// the id of every helpful number
ll id[2][MAXN];
// prefix of p
ll prep[MAXN];
// the different value of zcfk, or (n/i)
// zcfk -> https://www.cnblogs.com/linzhengmin/p/11061244.html
ll w[MAXN], wcnt;
// is not a prime -> array in the Euler Sieve
bool np[MAXN];
// Euler Sieve
void getPrime(int n){
np[0] = np[1] = 0;
for (int i = 2; i <= n; ++i){
if (!np[i]) p[++pcnt] = i, prep[pcnt] = (prep[pcnt - 1] + i) % MOD;
for (int j = 1; j <= pcnt && i * p[j] <= n; ++j){
np[p[j] * i] = 1;
if (!(i % p[j])) break;
}
}
}
// cac function s
int S(ll x, int y){
if (x <= 1 || p[y] > x) return 0;
int k = (x <= sqrtn) ? id[0][x] : id[1][n / x];
int res = (((ll)g[k] - pn[k] - prep[y - 1] + y - 1) % MOD + MOD) % MOD;
if (y == 1) res += 2;
for (int i = y; i <= pcnt && (ll)p[i] * p[i] <= x; ++i){
ll p1 = p[i], p2 = (ll)p[i] * p[i];
for (int j = 1; p2 <= x; ++j, p1 = p2, p2 *= p[i])
(res += (1ll * S(x / p1, i + 1) * (p[i] ^ j) % MOD + (p[i] ^ (j + 1))) % MOD) %= MOD;
}
return res;
}
int main(){
n = read(); sqrtn = sqrt(n); getPrime(sqrtn);
// zcfk -> caculate function g, init array w, id
for (ll i = 1, j; i <= n; i = j + 1){
w[++wcnt] = n / i, j = n / w[wcnt];
(w[wcnt] <= sqrtn) ? id[0][w[wcnt]] = wcnt : id[1][j] = wcnt;
pn[wcnt] = (w[wcnt] - 1) % MOD, g[wcnt] = (w[wcnt] % MOD) * ((w[wcnt] + 1) % MOD) % MOD;
if (g[wcnt] & 1) g[wcnt] = g[wcnt] + MOD;
g[wcnt] >>= 1; g[wcnt]--;
}
for (int j = 1; j <= pcnt; ++j)
for (int i = 1; i <= wcnt && p[j] * p[j] <= w[i]; ++i){
int k = (w[i] / p[j] <= sqrtn) ? id[0][w[i] / p[j]] : id[1][n/(w[i] / p[j])];
// minus the extra part
(g[i] -= (ll)p[j] * (g[k] - prep[j - 1]) % MOD) %= MOD;
// refresh pn
(pn[i] -= pn[k] - j + 1) %= MOD;
}
// answer is S(n,1) plus f(1) = S(n,1) + 1
int ans = S(n, 1) + 1;
printf("%d\n", (ans + MOD) % MOD);
return 0;
}
[算法]Min_25筛的更多相关文章
- 关于 min_25 筛的入门以及复杂度证明
min_25 筛是由 min_25 大佬使用后普遍推广的一种新型算法,这个算法能在 \(O({n^{3\over 4}\over log~ n})\) 的复杂度内解决所有的积性函数前缀和求解问题(个人 ...
- LG5325 【模板】Min_25筛
P5325 [模板]Min_25筛 题目背景 模板题,无背景. 题目描述 定义积性函数$f(x)$,且$f(p^k)=p^k(p^k-1)$($p$是一个质数),求 $$\sum_{i=1}^n f( ...
- min_25筛入门
目录 1.什么是min_25筛 2.前置知识 2.1.数论函数 2.2.埃拉托色尼筛 2.3.欧拉筛 3.min_25筛 3.1.计算质数贡献 3.2.计算总贡献 3.3.实现 4.例题 4.1.[L ...
- Note -「Min_25 筛」“你就说这素因子你要不要吧?你要不要?”
赛上想写,Track Lost 了属于是. \(\mathscr{Intro}\) Min_25 筛是用于求积性函数前缀和,同时顺带求出一些"有意思"的信息的筛法. 一 ...
- 【UOJ448】【集训队作业2018】人类的本质 min_25筛
题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...
- Min_25 筛 学习笔记
原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...
- UOJ188 Sanrd Min_25筛
传送门 省选之前做数论题会不会有Debuff啊 这道题显然是要求\(1\)到\(x\)中所有数第二大质因子的大小之和,如果不存在第二大质因子就是\(0\) 线性筛似乎可以做,但是\(10^{11}\) ...
- 【SPOJ】DIVCNTK min_25筛
题目大意 给你 \(n,k\),求 \[ S_k(n)=\sum_{i=1}^n\sigma_0(i^k) \] 对 \(2^{64}\) 取模. 题解 一个min_25筛模板题. 令 \(f(n)= ...
- 【51NOD1847】奇怪的数学题 min_25筛
题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...
随机推荐
- Django聚合数据
背景: 有些时候,光靠数据库中已有字段的数据,还不足以满足一些特殊场景的需求,例如显示一个作者的所有书籍数量. 这时候就需要在已有数据基础上,聚合出这些没有的数据. 为查询集生产聚合: Django ...
- C#新特性span 和 Tuple
span 可用于高性能字符串分割等 https://www.cnblogs.com/lonelyxmas/p/10171869.html https://www.codemag.com/article ...
- 应用安全 - 编程语言漏洞 - PHP语言漏洞汇总
CVE-2019-11043 Date: 类型: 远程代码执行 前置条件: Nginx + fastcgi + php-fpm 配置文件信息如下: location ~ [^/]\.php(/|$) ...
- 【监控笔记】【3.1】DML(CDC)、DDL(DDL触发器)跟踪数据更改,数据库审计
关键词:数据库审计.DDL审计.DML审计 [监控笔记][3.1]DML(CDC).DDL(DDL触发器)跟踪数据更改 [1]DML(CDC) 2008及以上 https://www.cnblogs. ...
- CentOS 7安装Python 2.6(与已有版本共存)
1. 安装需要用到的包 yum install -y zlib-devel bzip2-devel openssl-devel xz-libs wget 2. 下载 Python 2.6.8 版本 w ...
- C#基础篇之C#和 .Net框架的概念和运行原理
一.微软平台的发展史 二..Net框架包含的东西 1.名词解释 BCL:基类库(Base Class Library)系统和底层提供的最基本的类库 CLR:公共语言运行时(Common Languag ...
- Codeforces 1255E Send Boxes to Alice(前缀和+枚举+数论)
我们考虑前缀和sum[i],如果将a[i+1]中的一个塞入a[i]中,则不影响sum[i+1],但是sum[i]++,如果将a[i]中的一个塞入a[i+1],则不影响sum[i+1],但是sum[i] ...
- TMS320F28335——IO控制/定时计操作
一.实现GPIO控制 1.硬件连接 从电路原理图上看来,LED灯是接在GPIO34 上的. 2.IO设置 2.1设置功能 GPXMUX1/2:功能选择寄存器 GPXMUX1/2 每组 IO 一般 ...
- 前端开发HTML&css入门——HTML
HTML究竟为何物?其实HTML就是一种标记语言,英文全称为Hypertext Markup Language,翻译过来就叫超文本标记语言.它的作用就是负责负责网页的三个要素之中的结构. HTML使用 ...
- 关于原型链,原来这么简单?—————终结__proto__和prototype的那些事
今天,一个技术群里小朋友提出一个问题: Object.prototype.a = function () { console.log('a') } Function.prototype.b = fun ...