用途

快速($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

  1. #include<bits/stdc++.h>
  2. #include<tr1/unordered_map>
  3. #define CLR(a,x) memset(a,x,sizeof(a))
  4. #define MP make_pair
  5. using namespace std;
  6. typedef long long ll;
  7. typedef unsigned long long ull;
  8. typedef pair<int,int> pa;
  9. const int maxn=1e6+,P=1e9+;
  10.  
  11. inline ll rd(){
  12. ll x=;char c=getchar();int neg=;
  13. while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
  14. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  15. return x*neg;
  16. }
  17.  
  18. int pri[maxn],sump[maxn],cnt,tot,sqrtn;
  19. bool np[maxn];
  20. ll N,w[maxn];
  21. tr1::unordered_map<ll,int> id;
  22. int g[maxn],h[maxn];
  23.  
  24. inline int S(ll n,int j){
  25. if(n<=||pri[j]>n) return ;
  26. int re=(0ll+g[id[n]]-h[id[n]]-sump[j-]+j-)%P;
  27. if(j==) re=(re+)%P;
  28. for(int i=j;i<=cnt&&1ll*pri[i]*pri[i]<=n;i++){
  29. ll tmp=pri[i];
  30. for(int k=;tmp*pri[i]<=n;k++){
  31. re=(re+1ll*S(n/tmp,i+)*(pri[i]^k)+(pri[i]^(k+)))%P;
  32. tmp=tmp*pri[i];
  33. }
  34. }return re;
  35. }
  36.  
  37. int main(){
  38. //freopen("","r",stdin);
  39. ll i,j;
  40. N=rd();sqrtn=sqrt(N);
  41. for(i=;i<=sqrtn;i++){
  42. if(!np[i]){
  43. pri[++cnt]=i;
  44. sump[cnt]=(sump[cnt-]+i)%P;
  45. }
  46. for(j=;j<=cnt&&pri[j]*i<=sqrtn;j++){
  47. np[pri[j]*i]=;
  48. if(i%pri[j]==) break;
  49. }
  50. }
  51. for(i=;i<=N;i=j+){
  52. j=N/(N/i);
  53. w[++tot]=N/i;id[w[tot]]=tot;
  54. g[tot]=1ll*(w[tot]+)%P*((w[tot]-)%P)%P;
  55. if(g[tot]&) g[tot]+=P;
  56. g[tot]=g[tot]/%P;
  57. h[tot]=(w[tot]-)%P;
  58. }
  59. for(j=;j<=cnt;j++){
  60. for(i=;i<=tot&&1ll*pri[j]*pri[j]<=w[i];i++){
  61. g[i]=(g[i]-1ll*pri[j]*(g[id[w[i]/pri[j]]]-sump[j-]))%P;
  62. h[i]=(0ll+h[i]-(h[id[w[i]/pri[j]]]-j+))%P;
  63. }
  64. }
  65. printf("%d\n",((S(N,)+)%P+P)%P);
  66.  
  67. return ;
  68. }

[模板]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. android view 转Bitmap 生成截图

    文章链接:https://mp.weixin.qq.com/s/FQmYfT-KYiDbp-0HzK_Hpw 项目中经常会用到分享的功能,有分享链接也有分享图片,其中分享图片有的需要移动端对屏幕内容进 ...

  2. Android为TV端助力context转换类型

  3. .NET下对Web.config与App.Config的增删改操作的代码

    把代码过程常用的内容做个收藏,下边代码段是关于 .NET下对Web.config与App.Config的增删改操作的代码. <?xml version="1.0" encod ...

  4. redis 慢日志查询

    Intro 可能有一些命令需要很长时间才能在redis服务器上处理,导致请求超时. 长时间运行的命令的很少例子有 mget有大量的键,键*或写得不好的lua脚本. 可以运行通过 SlowLog 命令查 ...

  5. 多层json的构造,取值,还有使用bootstrap的tree view在前端展示的相关问题

    bootstrap-tree view是一款非常好用的插件,它可以添加任意多层节点,效果如下所示: 使用之前需要在HTML页面添加依赖文件: <link href="bootstrap ...

  6. Delphi连接MySql(待测试验证,使用mysql.pas未通过)

    要在一个Delphi程序中调用Mysql数据库,查到有个资料如下,待验证,验证后会给出结果.暂时做个标记 已经验证,验证日期:2018.6.18 验证结果:不可行 验证工具:XE7,mysql5.5. ...

  7. vue实现打印功能的两种方法

    第一种方法:通过npm 安装插件 1,安装  npm install vue-print-nb --save 2,引入  安装好以后在main.js文件中引入 import Print from 'v ...

  8. 虚拟机 与 host主机,无法ping通的问题

    这个写的比较简单,先做以下记录 centos虚拟机安装到别的电脑上,因为linux中的程序需要向外有网络互通,所以需要重新设置ip 通过 ifconfig eth4 192.168.0.20  bro ...

  9. the security settings could not be applied to the database(mysql安装error)【简记】

    在安装mysql时,出现“The security settings could not be applied to the database because the connection has f ...

  10. 基于tcp的云盘上传下载的模拟

    老师的博客: server端 import json import struct import json import struct import socket import os sk = sock ...