感觉好好用啊

Luogu上的杜教筛模版题一发 Min_25抢到了 rank1

$ Updated \ on 11.29 $被 STO txc ORZ踩爆啦


前言

$ Min$_$25$筛可以求积性函数的前缀和

要求$ f(p_i)为一个多项式,f(p_i^{k_i})可以快速计算$

以下部分暂时忽略$ 1$,即只考虑最小质因子$ \geq 2$的那些数


先考虑素数贡献

我们定义$ sp(n)$表示$\sum\limits_{i=1}^n f(p_i)$即前$ n$个素数的积性函数和

这里我们先假设$ f$对于质数的计算是完全积性函数

$ P_i$表示线筛求出的第$ i$小的质数

令$ g(n,i)$表示$ \sum\limits_{j=2}^n [j的最小质因数>P_i或j是质数]f(j)$

在这里$ f(j)$表示假设$ j$是质数,以质数方式带入函数计算的结果

由于合数会被筛掉因而不会影响答案

考虑怎么计算$ g(n,i)$

类似线性筛的方式每次筛掉一批合数

如果$P_i^2>n$则有$ g(n,i)=g(n,i-1)$

因为第$ i$个质数能筛掉的最小合数是$ P_i^2$

因此筛质数只需要筛到$ \sqrt n$即可

如果$ P_i^2<=n$有$ g(n,i)=g(n,i-1)-f(P_i)*(\ g( \frac{n}{P_i},i-1)-sp_{i-1}\ )$

原理是假设$ P_i$是一个质因数,它能产生的合数贡献是$ f(P_i)*g( \frac{n}{P_i} ,i-1)$

但是由于$ P_i$不一定是最小质因数,还要加回多减的小质数即$ sp_{i-1}$

由于满足$ f$是完全积性函数,上面部分还算挺清真的

我们需要求的只是$ g(x,INF)$

注意我们发现我们需要求的$ g(x,INF)$只需要满足存在$ d$使得$ x=\frac{n}{d} $即可

可以提前整数分块这样只需要计算$ \sqrt n$数量级的$ g(x,INF)$即可

可以通过滚动数组递推的方式完成这一部分


我们令$ S(n,m)$表示$ \sum\limits_{i=2}^n[i的最小质因数 \geq P_m]f(i)$

显然我们要求的是$ S(n,1)$

递归求解

贡献分两步统计:

质数贡献:$ g(n,INF)-sp(m-1)$

即去掉较小的质数以外其他质数都会被计算到

合数贡献:$ \sum\limits_{k=m}^{P_k^2<=n}\sum\limits_{e=1}^{P_k^{e+1}<=n}f(P_k^e)S(\frac{n}{P_k^e},k+1)+f(P_k^{e+1})$

即枚举当前选择的最小质因数以及数量转移,同时计算只选择多于两个当前因数即不往后转移的合数情况

这样直接转移就好了


栗子:筛$ \sum\limits_{i=1}^n \phi(i)$

发现$ phi(P_i)=P_i-1$即对于质数的计算不是一个完全积性函数

这时候需要拆开计算

令$ g(P_i)=P_i$,$ h(P_i)=1$

这样分成两个完全积性函数,分别筛质数求值然后相减即可

推$ S(n,m)$的时候不会有影响

筛$ \sum\limits_{i=1}^n \mu(i)$也没有本质区别

传送门:here

$ my \ code:$

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define file(x)freopen(x".in","r",stdin);freopen(x".out","w",stdout)
#define rt register unsigned
#define l putchar('\n')
#define ll long long
#define r read()
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt;
ll sp[],g[];int h[],ss[];bool pri[];
int id1[],id2[],q[],t,sz;
void init(){
sz=sqrt(n);
for(rt i=;i<=sz;i++){
if(!pri[i])ss[++cnt]=i,sp[cnt]=sp[cnt-]+i;
for(rt j=;j<=cnt&&i*ss[j]<=sz;j++){
pri[i*ss[j]]=;
if(i%ss[j]==)break;
}
}
for(rt i=;i<=n;){
const unsigned v=n/i;unsigned R=n/v;
q[++t]=v;if(v<=sz)id1[v]=t;else id2[n/v]=t;
g[t]=(ll)v*(v+)/-;
h[t]=v-;i=R+;
}
}
int id(int x){
if(x<=sz)return id1[x];
return id2[n/x];
}
ll S(int n,int m){
if(n<=||ss[m]>n)return ;
ll ret=g[id(n)]-sp[m-]+m-;//cout<<n<<' '<<m<<endl;
for(rt k=m;ss[k]*ss[k]<=n&&k<=cnt;k++)
for(rt v=ss[k],p1=ss[k]-;(ll)v*ss[k]<=n;v=v*ss[k],p1=p1*ss[k])
ret+=(S(n/v,k+)+ss[k])*p1;//ss[k];
return ret;
} int D(int n,int m){
if(n<=||ss[m]>n)return ;
int ret=h[id(n)]+(m-);//cout<<n<<' '<<m<<endl;
for(rt k=m;ss[k]*ss[k]<=n&&k<=cnt;k++)
ret-=D(n/ss[k],k+);//ss[k];
return ret;
}
int main(){
for(rt T=r;T;T--){
n=r;
if(n==){
cout<<<<' '<<<<endl;
continue;
}
t=cnt=;init();
for(rt i=;i<=cnt;i++){//枚举外层质数
const int v=ss[i]*ss[i];
for(rt j=;j<=t&&v<=q[j];j++){
const int k=id(q[j]/ss[i]);
g[j]-=ss[i]*(g[k]-sp[i-]);
h[j]-=h[k]-i+;
}
}
for(rt i=;i<=t;i++)g[i]-=h[i],h[i]=-h[i];
write(S(n,)+);putchar(' ');
writeln(D(n,)+);
}
return ;
}

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

  1. Min_25筛 学习笔记

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

  2. Min_25 筛 学习笔记

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

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

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

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

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

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

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

  6. Powerful Number 筛学习笔记

    Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...

  7. Min_25筛 学习小记

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

  8. min-25筛学习笔记

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

  9. min_25 筛学习小记

    min_25筛 由 dalao min_25 发明的筛子,据说时间复杂度是极其优秀的 \(O(\frac {n^{\frac 3 4}} {\log n})\),常数还小. 1. 质数 \(k\) 次 ...

随机推荐

  1. 中性SNP的突变年龄评估(estimate the average age of a neutral two-allele polymorphism)

    假设中性突变的频率分别为P和1-P,则其突变年龄为:-4Ne[p*( logep)+(1-p)* loge (1-p)] The average age of a neutral two-allele ...

  2. 厘摩(centimorgan,cM)到底是啥鬼

    根据维基百科的定义: 厘摩(centimorgan,简写为cM),或称为图距单位(map unit),是遗传连锁中的距离单位,以现代遗传学之父托马斯·亨特·摩尔根的名字命名.1厘摩的定义为两个位点间平 ...

  3. Android Studio项目引入外部库注意事项(zxing)

    1.复制到app同级目录下,zxing: 2.在项目根目录下的settings.gradle下添加第三方库目录 4.在app/build.gradle下添加编译依赖 compile project(p ...

  4. Transactional 事务

    1.事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚 其实像第一种try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中 ...

  5. mysql ibdata1损坏

    机房一台服务器上的mysql运行一段时间了,突然出现了一个很奇怪的现象:重启后无法恢复了!准确情况是:启动mysql后随即就又关闭了. 查看mysql错误日志如下: 160920 22:41:41 m ...

  6. (string stoi 栈)leetcode682. Baseball Game

    You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...

  7. day-04(jquery)

    回顾: js: 组成部分: ECMAScript BOM DOM 变量声明 var 变量名=初始化值; 数据类型: 原始类型 Undefined Null String Number Boolean: ...

  8. 互联网运营+SEO:推荐必看的5本书籍

    本文首发于:风云社区(scoee.com) 最近开始学习和研究互联网运营和SEO,对于我这个小白来讲,还是有些吃力,毕竟从来没接触这方面的,尽管在之前的软件公司做过售前和产品相关的工作,但毕竟与互联网 ...

  9. mysql的使用

    数据库操作: 1)创建数据库和删除数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库,root用户拥有最高权限,可以使用 mysqladmin 命令来创建数据库: mysql ...

  10. Mybatis笔记三:全局配置文件

    目录 配置文件 dtd提示 properties标签(不怎么用) typeAliases 自动把下划线换成驼峰命名 配置文件 看着这个配置文件,我们将对这个配置文件进行细致的讲解 <?xml v ...