min_25筛学习笔记【待填坑】
看见ntf和pb两位大佬都来学了,然后就不自觉的来学了。
我们考虑这样一个问题。
$$ans=\sum_{i=1}^nf(i)$$其中$1\leq n\leq 10^{10}$
其中$f(i)$是一个非常奇怪的函数,并不像$\mu(i),\varphi(i),i\varphi(i)$那样具有那么好的性质。但是满足以下条件:
1.若$p$为质数,则$f(p)$是一个关于$p$的多项式,比如$\mu(p)=-1,\varphi(p)=p-1$.
2.若$p$为质数,$e$为正整数,则$f(p^e)$可以很快求出。(通常是$O(1)$)
3.$f(n)$为积性函数。
然后就可以使用min_25筛了。(顾名思义是min_25发明的)
首先,我们需要知道min_25筛是埃氏筛的一个拓展,它的思想很大一部分借助于埃氏筛。
回想一下埃氏筛,我们是每次将最小质因子为$p_i$的合数筛去,剩下的就是质数。
我们知道这些最小质因子至多为$\sqrt{n}$,所以合数可以通过枚举最小质因子来计算,质数我们则使用另外的方法。
首先我们看质数的怎么做。
$$\sum_{i=1}^n[i\in Prime]f(i)$$
根据条件1,我们知道$f(i)$是一个多项式,这样的话我们可以按照次数将$f(i)$拆成$i^k$之和,因为$i^k$是一个完全积性函数(很快就有用的)。
$$\sum_{i=1}^n[i\in Prime]i^k$$
为了计算这个,我们需要引入一个辅助数组$g(n,j)$。(鬼知道是怎么想到的)
$$g(n,j)=\sum_{i=1}^n[i\in Prime \ or \ minp(i)>P_j]i^k$$
其中$minp(i)$表示$i$的最小质因子,所以
$$\sum_{i=1}^n[i\in Prime]i^k=g(n,|P|)$$
既然我们要使用质数,所以我们可以先用欧拉筛把所有$\leq \sqrt{n}$的质数筛出来,同时还要预处理$\sum_{i=1}^j[i\in Prime]i^k$.
我们考虑dp计算。既然是埃氏筛,我们就要在$g(n,j-1)$中最小质因子为$P_j$的合数筛去。]'
对于$P_j\geq \sqrt{n}$的就不用管它了,因为肯定不可能。
首先,由于它是完全积性函数,所以$P_j$可以直接提出来,剩下的减去$i\leq \lfloor\frac{n}{P_j}\rfloor$中的数就可以了。
这些数中要求质因子$\geq P_j$,所以是$g(\lfloor\frac{n}{P_j}\rfloor,j-1)$,但是这里面质数被重复计算了,所以要减去里面的质数。
$$g(n,j)=g(n,j-1)-P_j^k(g(\lfloor\frac{n}{P_j}\rfloor,j-1)-\sum_{i=1}^{j-1}[i\in Prime]i^k)$$
但是这样的话是$O(n*|P|)$的,时间和空间都承受不了。但是我们发现我们可以使用一个优化。
我们发现$g(n,j)$中$n$只有$O(\sqrt{n})$种取值,因为每次递归的时候是$n$变为$\lfloor\frac{n}{P_j}\rfloor$,而我们发现
$$\lfloor\frac{\lfloor\frac{a}{b}\rfloor}{c}\rfloor=\lfloor\frac{a}{bc}\rfloor$$
所以$n$只会变为$\lfloor\frac{n}{x}\rfloor$,于是我们就直接“手动”离散化,这个可以看代码。
然后$g(n,j)$的第二维也可以滚动数组滚掉。所以时间$O(\sqrt{n}*|P|)$,空间$O(\sqrt{n})$.
预处理部分终于结束了,接下来我们考虑计算答案,首先我们还是需要一个辅助数组。
$$S(n,j)=\sum_{i=1}^n[minp(i)>P_j]f(i)$$
像上面说的一样,分质数和合数两类计算。
$$S(x,y)=g(x,|P|)-\sum_{i=1}^{y}f(P_i)+\sum_{P_k\leq \sqrt{x},k>j}\sum_{e>0,P_k^e\leq x}f(p_k^e)(S(\lfloor\frac{x}{P_k^e}\rfloor,k)+[e>1])$$
前面两项指的是质数,后面的和式是枚举最小质因子$P_k$和它的次数$e$,
这个跟$g$不同,$S$是要按照第二维倒着计算的,但是我们也可以使用递归的方法来计算。
$S(n,0)+f(1)$就是最终答案。
至于上面说的那个手动离散化,我们要开两个数组$id1$和$id2$,分别记录$\leq \sqrt{n}$和$>\sqrt{n}$的部分的数值的编号。这样就不用map了,可以省掉一个log。
至于时间复杂度?我也不知道,总之跟杜教筛差不多,甚至有时候比杜教筛还要快。
#include<bits/stdc++.h>
#define Rint register LL
using namespace std;
typedef long long LL;
const int N = , mod = 1e9 + , inv2 = , inv3 = ;
LL n, Sqr, pri[N], tot, pre1[N], pre2[N], ind1[N], ind2[N], g1[N], g2[N], w[N], cnt;
bool notp[N];
inline void init(LL m){
notp[] = notp[] = true;
for(Rint i = ;i <= m;i ++){
if(!notp[i]){
pri[++ tot] = i;
pre1[tot] = (pre1[tot - ] + i) % mod;
pre2[tot] = (pre2[tot - ] + i * i) % mod;
}
for(Rint j = ;j <= tot && i * pri[j] <= m;j ++){
notp[i * pri[j]] = true;
if(!(i % pri[j])) break;
}
}
}
inline LL S(LL x, int y){
if(pri[y] >= x) return ;
LL k = (x <= Sqr) ? ind1[x] : ind2[n / x];
LL ans = (g2[k] - g1[k] + pre1[y] - pre2[y] + mod + mod) % mod;
for(Rint i = y + ;i <= tot && pri[i] * pri[i] <= x;i ++){
LL pe = pri[i];
for(Rint e = ;pe <= x;e ++, pe *= pri[i]){
LL xx = pe % mod;
ans = (ans + xx * (xx - ) % mod * (S(x / pe, i) + (e > ))) % mod;
}
}
return ans % mod;
}
int main(){
scanf("%lld", &n);
Sqr = sqrt(n);
init(Sqr);
for(Rint i = , last;i <= n;i = last + ){
last = n / (n / i);
w[++ cnt] = n / i;
LL xx = w[cnt] % mod;
g1[cnt] = (xx * (xx + ) / + mod - ) % mod;
g2[cnt] = (xx * (xx + ) / % mod * ( * xx + ) % mod * inv3 % mod + mod - ) % mod;
if(n / i <= Sqr) ind1[w[cnt]] = cnt;
else ind2[last] = cnt;
}
for(Rint i = ;i <= tot;i ++)
for(Rint j = ;j <= cnt && pri[i] * pri[i] <= w[j];j ++){
LL k = (w[j] / pri[i] <= Sqr) ? ind1[w[j] / pri[i]] : ind2[n / (w[j] / pri[i])];
g1[j] -= pri[i] * (g1[k] - pre1[i - ] + mod) % mod;
g2[j] -= pri[i] * pri[i] % mod * (g2[k] - pre2[i - ] + mod) % mod;
if(g1[j] < ) g1[j] += mod;
if(g2[j] < ) g2[j] += mod;
}
printf("%lld", (S(n, ) + ) % mod);
}
luogu5325
练习题:
min_25筛学习笔记【待填坑】的更多相关文章
- Min_25筛 学习笔记
这儿只是一个简单说明/概括/总结. 原理见这: https://www.cnblogs.com/cjyyb/p/9185093.html https://www.cnblogs.com/zhoushu ...
- Min_25 筛 学习笔记
原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...
- 洲阁筛 & min_25筛学习笔记
洲阁筛 给定一个积性函数$F(n)$,求$\sum_{i = 1}^{n}F(n)$.并且$F(n)$满足在素数和素数次幂的时候易于计算. 显然有: $\sum_{i = 1}^{n} F(n) = ...
- Min_25筛学习笔记
感觉好好用啊 Luogu上的杜教筛模版题一发 Min_25抢到了 rank1 $ Updated \ on 11.29 $被 STO txc ORZ踩爆啦 前言 $ Min$_$25$筛可以求积性函数 ...
- $Min\_25$筛学习笔记
\(Min\_25\)筛学习笔记 这种神仙东西不写点东西一下就忘了QAQ 资料和代码出处 资料2 资料3 打死我也不承认参考了yyb的 \(Min\_25\)筛可以干嘛?下文中未特殊说明\(P\)均指 ...
- Powerful Number 筛学习笔记
Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...
- (目录)Fortran学习笔记:开坑!!!
前言:因为某些原因,需要使用Fortran编写程序,记录下Fortran语法学习过程中的部分笔记.在此开坑记录,立下Flag,"希望年末能够更新完" Fortran 学习笔记 陈橙 ...
- Min_25筛 学习小记
前言 为什么叫学习小记呢?因为暂时除了模板题就没有做其他的东西了.(雾 这个东西折磨了我一整天,看得我身不如死,只好结合代码理解题解,差点死在机房.(话说半天综合半天竞赛真是害人不浅) 为了以后忘了再 ...
- min-25筛学习笔记
Min_25筛简介 \(\text{min_25}\)筛是一种处理一类积性函数前缀和的算法. 其中这类函数\(f(x)\)要满足\(\sum_{i=1}^{n}[i\in prime]\cdot f( ...
随机推荐
- BM算法解析(计算机算法-设计与分析导论(第三版))
转载请声明
- 将自定义dockerfile生成的image推送到仓库中
本文为以阿里云的案例方法,其他方法未尝试 1.注册阿里云账号 2.设置密码并通过docker登录 3.创建命名空间 4.创建镜像仓库 创建仓库时,需要选择代码源的仓库储存的方式,这里我用的是gitHu ...
- java 框架-模板引擎FreeMarker
https://www.cnblogs.com/itdragon/p/7750903.html FreeMarker是一个很值得去学习的模版引擎.它是基于模板文件生成其他文本的通用工具.本章内容通过如 ...
- openmp 和 thread 性能实测
#include <stdio.h> #include <iostream> #include <thread> #include<omp.h> //# ...
- ElasticSearch创建动态索引
ElasticSearch创建动态索引 需求:某实例需要按照月份来维护,所以之前的“写死”索引的方式当然不行了.通过百度和看SpringDataElasticSearch官方文档,最后解决了这个问题. ...
- 如何判断 Session是否存在
相信很多人都跟我一样,在写网页中有些位置通过其他网页设置了 Session然后跳转到目标页面就需要要用 Session,但是那个位置如果是直接打开的就用不到 Session,那么问题就来了,例如:系统 ...
- restTemplate源码解析(三)创建ClientHttpRequest请求对象
所有文章 https://www.cnblogs.com/lay2017/p/11740855.html 正文 上一篇文章中,我们大体看了一下restTemplate的核心逻辑.再回顾一下核心代码 p ...
- Unity使用Resources读取Resources路径下的二进制文件(Binary Data)必须使用 .bytes扩展名
将某二进制文件放在Resources目录下,希望用Resources.Load<TextAsset>的方式读取,发现TextAsset是null 查阅Unity文档得知,使用Resourc ...
- php定界符介绍
php界定符就是为了照样输出内容.它的格式如下: <<<EOF ...... EOF; 其中EOF是自定义的变量,但要成对出现! 首先附上一段php代码: <?php $a = ...
- MySQL5.7.28免安装版配置
下载 安装配置 问题及解决方案 一.下载 找到你要的版本点击“looking for the latest GA version?”切换,我这个安装的是5.7.28,然后往下拉: 找到免安装的压缩包: ...