Min_25 筛

yyb好神仙啊

干什么用的

可以在\(O(\frac{n^{\frac 34}}{\log n})\)的时间内求积性函数\(f(x)\)的前缀和。

别问我为什么是这个复杂度

要求\(f(p)\)是一个关于\(p\)的简单多项式,\(f(p^c)\)可以快速计算。

怎么做啊

首先我们需要对每个\(x=\lfloor\frac ni\rfloor\)求出\(\sum_{i=1}^x[i是质数]f(i)\)。

怎么求呢?

先线性筛出\(\sqrt n\)范围内的质数,设\(P_j\)表示从小到大第\(j\)个质数。

设\(g(n,j)=\sum_{i=1}^{n}[i \in P \ or\ \min(p)>P_j]f(i)\)

说人话就是:\(i\)是质数,或者\(i\)的最小质因子大于\(P_j\),把\(1-n\)内满足条件的\(f(i)\)加起来就是\(g(n,j)\)。

这个东西的实际含义是什么呢?可以参考一下埃氏筛法的运行过程。

假设现在有\(n\)个数依次排开,第\(i\)个数是\(f(i)\),根据埃氏筛法的那套理论,每次选出一个质数,然后筛掉它的所有倍数。

会发现\(g(n,j)\)就是运行\(j\)次埃氏筛法后,没被筛掉的所有数之和加上所有的\(f(p)\)。

我们要求的\(\sum_{i=1}^x[i是质数]f(i)\)其实就是\(g(x,|P|)\),其中\(|P|\)是质数集合的大小。

考虑\(g(n,j)\)的转移,分两种情况:

1、\(P_j^2>n\)。此时运行的第\(j\)次已经不会再筛掉任何数了(因为第\(j\)次运行中筛掉的最小的数是\(P_j^2\)),所以此时\(g(n,j)=g(n,j-1)\)。

2、\(P_j^2\le n\)。这时候我们就要考虑哪些数被筛掉了。被筛掉的数一定含有质因子\(P_j\),且除掉\(P_j\)后最小的质因子会大于等于\(P_j\)。考虑减去\(f(P_j)\times g(\frac{n}{P_j},j-1)\),但在\(g(\frac{n}{P_j},j-1)\)中多减去了\(\sum_{i=1}^{j-1}f(P_i)\)这些最小质因子小于\(P_j\)的函数值,所以再把它们加上就好了。

所以总结起来就是:

\[g(n,j)=\begin{cases} g(n,j-1)&P_j^2\gt n\\ g(n,j-1)-f(P_j)[g(\frac{n}{P_j},j-1)-\sum_{i=1}^{j-1}f(P_i)]&P_j^2\le n\end{cases}
\]

关于\(g(n,j)\)的初值问题:\(g(n,0)\)表示所有数的和,也就是把所有数都当作是质数带入\(f(p)\)的那个多项式中算出的结果。

因为最后只要求所有的\(g(x,|P|)\),所以在求的时候数组只开了一维。这样做的复杂度被证明是\(O(\frac{n^{\frac 34}}{\log n})\)的。

以\(f(x)=1\)即求\(n\)以内的质数个数为例:

for (int i=1,j;i<=n;i=j+1){
j=n/(n/i);w[++m]=n/i;
if (w[m]<=Sqr) id1[w[m]]=m;
else id2[n/w[m]]=m;
g[m]=(w[m]-1)%mod;
}
for (int j=1;j<=tot;++j)
for (int i=1;i<=m&&pri[j]*pri[j]<=w[i];++i){
int k=(w[i]/pri[j]<=Sqr)?id1[w[i]/pri[j]]:id2[n/(w[i]/pri[j])];
g[i]=(g[i]-g[k]+j-1)%mod;g[i]=(g[i]+mod)%mod;
}

说了那么多你求出了啥?

现在我们已经对于\(x=\lfloor\frac ni\rfloor\)求出了\(\sum_{i=1}^x[i是质数]f(i)\)。

我们设\(S(n,j)=\sum_{i=1}^n[\min(p)\ge P_j]f(i)\),也就是所有满足最小质因子大于等于\(P_j\)的\(f\)值之和。

那么最终的答案就是\(S(n,1)+f(1)\)。

鉴于质数的答案我们已经算出来了,是\(g(n,j)-\sum_{i=1}^{j-1}f(P_i)\)。(因为要保证最小质因子大于等于\(P_j\)所以要把小于它的质数减掉)

考虑合数。我们枚举这个合数的最小质因子及其出现次数,然后直接乘即可。

\[S(n,j)=g(n,|P|)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k=j}^{P_k^2\le n}\sum_{e=1}^{P_k^{e+1}\le n}S(\frac{n}{P_k^e},k+1)\times f(P_k^e)+f(P_k^{e+1})
\]

然后这个的复杂度也被证明是\(O(\frac{n^{\frac 34}}{\log n})\)的。

举个栗子

loj6053简单的函数

定义积性函数\(f(p^c)=p\oplus c\),求其前\(n\)项和。

会发现除了\(2\)以外的质数都满足\(f(p)=p\oplus 1=p-1\),所以可以分别计算出\(g(x,|P|)=\sum_{i=1}^x[i是质数]i\)以及\(h(x,|P|)=\sum_{i=1}^x[i是质数]1\)。

在处理\(S\)的时候,如果\(j=1\),就说明其中包含\(2\)这个因数,因此把答案\(+2\)即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
const int N = 1e6+5;
const int mod = 1e9+7;
int Sqr,zhi[N],pri[N],sp[N],tot,m,id1[N],id2[N],g[N],h[N];
ll n,w[N];
void Sieve(int n){
zhi[1]=1;
for (int i=2;i<=n;++i){
if (!zhi[i]) pri[++tot]=i,sp[tot]=(sp[tot-1]+i)%mod;
for (int j=1;i*pri[j]<=n;++j){
zhi[i*pri[j]]=1;
if (i%pri[j]==0) break;
}
}
}
int S(ll x,int y){
if (x<=1||pri[y]>x) return 0;
int k=(x<=Sqr)?id1[x]:id2[n/x];
int res=(1ll*g[k]-h[k]-sp[y-1]+y-1)%mod;res=(res+mod)%mod;
if (y==1) res+=2;
for (int i=y;i<=tot&&1ll*pri[i]*pri[i]<=x;++i){
ll p1=pri[i],p2=1ll*pri[i]*pri[i];
for (int e=1;p2<=x;++e,p1=p2,p2*=pri[i])
(res+=(1ll*S(x/p1,i+1)*(pri[i]^e)%mod+(pri[i]^(e+1)))%mod)%=mod;
}
return res;
}
int main(){
scanf("%lld",&n);
Sqr=sqrt(n);Sieve(Sqr);
for (ll i=1,j;i<=n;i=j+1){
j=n/(n/i);w[++m]=n/i;
if (w[m]<=Sqr) id1[w[m]]=m;
else id2[n/w[m]]=m;
h[m]=(w[m]-1)%mod;
g[m]=((w[m]+2)%mod)*((w[m]-1)%mod)%mod;
if (g[m]&1) g[m]+=mod;g[m]/=2;
}
for (int j=1;j<=tot;++j)
for (int i=1;i<=m&&1ll*pri[j]*pri[j]<=w[i];++i){
int k=(w[i]/pri[j]<=Sqr)?id1[w[i]/pri[j]]:id2[n/(w[i]/pri[j])];
g[i]=(g[i]-1ll*pri[j]*(g[k]-sp[j-1])%mod)%mod;g[i]=(g[i]+mod)%mod;
h[i]=(h[i]-h[k]+j-1)%mod;h[i]=(h[i]+mod)%mod;
}
printf("%d\n",S(n,1)+1);
return 0;
}

Min_25 筛的更多相关文章

  1. 【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, ...

  2. Min_25 筛 学习笔记

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

  3. UOJ188 Sanrd Min_25筛

    传送门 省选之前做数论题会不会有Debuff啊 这道题显然是要求\(1\)到\(x\)中所有数第二大质因子的大小之和,如果不存在第二大质因子就是\(0\) 线性筛似乎可以做,但是\(10^{11}\) ...

  4. 【SPOJ】DIVCNTK min_25筛

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

  5. 【51NOD1847】奇怪的数学题 min_25筛

    题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...

  6. 【51NOD1965】奇怪的式子 min_25筛

    题目描述 给你\(n\),求 \[ \prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)} \] 对\({10}^{12}+39\)取模. \(\sigma_0(i)\)表示约数个 ...

  7. min_25筛

    min_25筛 用来干啥? 考虑一个积性函数\(F(x)\),用来快速计算前缀和\[\sum_{i=1}^nF(i)\] 当然,这个积性函数要满足\(F(x),x\in Prime\)可以用多项式表示 ...

  8. 关于 min_25 筛的入门以及复杂度证明

    min_25 筛是由 min_25 大佬使用后普遍推广的一种新型算法,这个算法能在 \(O({n^{3\over 4}\over log~ n})\) 的复杂度内解决所有的积性函数前缀和求解问题(个人 ...

  9. 51Nod1222 最小公倍数计数 数论 Min_25 筛

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1222.html 题意 给定 $a,b$, 求 $$\sum_{n=a}^b \sum_{i=1}^n ...

  10. LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】

    先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...

随机推荐

  1. SQL中char、varchar、nvarchar、ntext的区别(转载)

    char    char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符.nvarchar(n ...

  2. 从angularjs传递参数至Web API

    昨天分享的博文<angularjs呼叫Web API>http://www.cnblogs.com/insus/p/7772022.html,只是从Entity获取数据,没有进行参数POS ...

  3. 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常

    新版开发者工具增加了https检查功能:可使用此功能直接检查排查ssl协议版本问题: 可能原因:0:后台域名没有配置0.1:域名不支持https1:没有重启工具:2:域名没有备案,或是备案后不足24小 ...

  4. 七年一冠、IG牛13的背后是什么!

    最近忙着看S8世界总决赛,博客荒废了近一个月,后续步入正轨.   2018年11月3日.S8世界总决赛.中国终于夺得了S系列赛的总冠军. “IG牛逼”也开始刷爆社交圈,对于在S3入坑的我来说,也弥补上 ...

  5. Individual Project - Word frequency program——12061154Joy

    Description&Requirement: http://www.cnblogs.com/jiel/p/3978727.html 项目时间估计 理解项目要求: 1h 构建项目逻辑: 1h ...

  6. [BUAA-SE-2018]结对作业测试报告

    目录 1. 测试方式 2. 评分规则 2.1 测试点组成 2.2 性能测试的分级 2.3 重新提交的扣分策略 3. 评测结果 3.1 罗老师班 3.2 任老师班 3.3 表中数据的说明 4. 测试点下 ...

  7. Python学习笔记 -- 第六章 文件操作

    I/O编程 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这 ...

  8. Leetcode 279. 完全平方数

    题目描述: https://leetcode-cn.com/problems/perfect-squares/ 解题思路: 同样是dp,一开始的想法是,对于每个数i做拆分为j和(i-j),利用动态转移 ...

  9. 第三个Sprint ------第十一天

    四则运算APP推广: 1通过微信公众平台推广APP,写一片软文,然后推送出去.分享朋友圈.QQ空间. 2通过微博推广APP,@各微博大户. 3让之前内侧的同学转发给自己的小弟小妹或者侄女侄子! 总结: ...

  10. “数学口袋精灵”App的第三个Sprint计划----开发日记(第一天12.7~第十天12.16)

    “数学口袋精灵”第三个Sprint计划----第一天 项目进度: 基本完成一个小游戏,游戏具有:随机产生算式,判断对错功能.通过轻快的背景音乐,音效,给玩家提供一个良好的氛围.  任务分配: 冯美欣: ...