P5325-[模板]Min_25筛

正题

题目链接:https://www.luogu.com.cn/problem/P5325


题目大意

定义一个积性函数满足f(pk)=pk(pk−1)f(p^k)=p^k(p^k-1)f(pk)=pk(pk1)
∑i=1nf(i)\sum_{i=1}^nf(i)i=1nf(i)


解题思路

首先我们可以把f(pk)f(p^k)f(pk)是质数的情况拆成一个222阶的多项式f(x)=x2−xf(x)=x^2-xf(x)=x2x

然后就是Min25\text{Min25}Min25筛了。我们先需要求出质数有关的答案,考虑把这个多项式的多个阶分开来求。

有关质数的求法,我们定义dpdpdp数组
gk(n,j)=∑i=1n[i∈Priorminp(i)>pj]ikg_k(n,j)=\sum_{i=1}^n[i\in Pri\ \ or\ \ minp(i)>p_j]i^kgk(n,j)=i=1n[iPri  or  minp(i)>pj]ik(上面PriPriPri表示质数集,minp(x)minp(x)minp(x)表示xxx的最小质因子,pjp_jpj表示≤n\leq \sqrt{n}n的第jjj个质因子,kkk表示多项式的某个阶,后面为了方便gkg_kgk写作ggg,后文中的g(n,j)g(n,j)g(n,j)中的nnn都与输入的nnn无关,只是一个变量)

具体的说就是如果iii是质数或者最小质因子超过pjp_jpj,那当某个pjp_jpj最接近但小于n\sqrt nn时,g(n,j)g(n,j)g(n,j)就是我们需要的答案了。

因为一个合数xxx满足minp(x)≤xminp(x)\leq\sqrt xminp(x)x,所以pjp_jpj的数量级很小,可以利用这个性质。

递推这个数组时对于每次jjj往上加相当于多加上了一些限制条件,也就是g(n,j)g(n,j)g(n,j)相对于g(n,j−1)g(n,j-1)g(n,j1)我们需要减去一些多余的答案。

这些多余的答案就是最小质因数是pjp_jpj的数,这些数就是pjk∗(g(npj,j−1)−g(pj−1,j−1))p_j^k*{\large(}\ g(\frac{n}{p_j},j-1)-g(p_{j-1},j-1)\ {\large)}pjk( g(pjn,j1)g(pj1,j1) )
g(npj,j−1)−g(pj−1,j−1))g(\frac{n}{p_j},j-1)-g(p_{j-1},j-1)\ {\large)}g(pjn,j1)g(pj1,j1) )表示枚举一个乘上pjp_{j}pj之后不会超过nnn且最小质因子超过pjp_{j}pj的数,这些数乘上pjp_jpj后就是不重不漏的表示最小质因子是pjp_jpj的数,因为y=xky=x^ky=xk是一个完全积性函数,所以可以直接乘上一个pjkp_j^kpjk

现在我们就有递推式
g(n,j)=g(n,j−1)+pjk(g(npj,j−1)−g(pj−1,j−1))g(n,j)=g(n,j-1)+p_j^k{\large(}\ g(\frac{n}{p_j},j-1)-g(p_{j-1},j-1)\ {\large)}g(n,j)=g(n,j1)+pjk( g(pjn,j1)g(pj1,j1) )
快速处理g(n,0)g(n,0)g(n,0)然后递推,可以注意到g(pj−1,j−1)g(p_{j-1},j-1)g(pj1,j1)就是前j−1j-1j1个质数的kkk次方和,因为pjp_jpj数量级只有n\sqrt nn所以可以直接预处理,因为后面还要用就定义spi=∑i=1nf(pi)sp_i=\sum_{i=1}^nf(p_i)spi=i=1nf(pi)

还有发现无论如何每个g(x,j)g(x,j)g(x,j)的取值都只与⌊nx⌋\lfloor\frac{n}{x}\rfloorxn有关,所以我们对于ggg数组的每一个jjj都只有n\sqrt nn个连续的范围内的同一取值。所以我们可以直接整除分块来大大缩减数量级的空间和时间。

给出一个xxx如何快速得到g(x,j)g(x,j)g(x,j)的储存地址?一个比较巧妙的方法是如果x≤nx\leq \sqrt nxn那么ind1xind1_xind1x表示xxx的储存位置,否则用ind2nxind2_{\frac{n}{x}}ind2xn表示xxx的储存地址。

然后jjj那个维度我们只需要用到j=cntj=cntj=cntcntcntcnt表示n\sqrt nn以内的质数数量)值,所以我们直接滚动来递推就好了。

现在我们知道了所有的g(i,cnt)g(i,cnt)g(i,cnt),这道题的话具体的值就是g2(i,cnt)−g1(i,cnt)g_2(i,cnt)-g_1(i,cnt)g2(i,cnt)g1(i,cnt)就可以表示前缀质数fff的函数和了。下面简写g(i)=g2(i,cnt)−g1(i,cnt)g(i)=g_2(i,cnt)-g_1(i,cnt)g(i)=g2(i,cnt)g1(i,cnt)

然后就是要求答案了,同样使用dpdpdp的技巧,设
S(n,j)=∑i=2n[minp(i)>pj]f(i)S(n,j)=\sum_{i=2}^n[minp(i)>p_j]f(i)S(n,j)=i=2n[minp(i)>pj]f(i)
然后对于S(n,j)S(n,j)S(n,j)的答案我们可以分为质数和非质数两部分,质数部分显然就是g(n)−spng(n)-sp_ng(n)spn(不记得spspsp的去看前面定义)。
然后合数部分我们考虑递归下去处理就是∑k>jpke≤nf(pke)(S(npke,k)+[e≠1])\sum_{k>j}^{p_{k}^e\leq n}f(p_k^e){\large(}S(\frac{n}{p_k^e},k)+[e\neq1]{\large)}k>jpkenf(pke)(S(pken,k)+[e=1])pkep_k^epke是枚举质因子就不多说了,那个[e≠1][e\neq 1][e=1]是因为pkp_kpk已经作为质数被计算过了,但是后面的pkep_k^epke还没有。

现在就有S(n,j)S(n,j)S(n,j)的递推式了
S(n,j)=g(n)−spn+∑k>jpke≤nf(pke)(S(npke,k)+[e≠1])S(n,j)=g(n)-sp_n+\sum_{k>j}^{p_{k}^e\leq n}f(p_k^e){\large(}S(\frac{n}{p_k^e},k)+[e\neq1]{\large)}S(n,j)=g(n)spn+k>jpkenf(pke)(S(pken,k)+[e=1])

递归下去做就好了,说是不知道因为啥定理所以是不用记忆化的。

一个细节就是f(1)f(1)f(1)最好不要统计进去,最好加上就好了

据说时间复杂度是O(n34log⁡n)O(\frac{n^{\frac{3}{4}}}{\log n})O(lognn43)的,反正这题我没开O2O2O2的话1e101e101e10只跑了七百多毫秒。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const ll N=1e6+10,P=1e9+7;
ll n,T,cnt,tot,pri[N],sp1[N],sp2[N],ind1[N],ind2[N],g1[N],g2[N],w[N];
bool v[N];
void init(ll n){for(ll i=2;i<=n;i++){if(!v[i]){pri[++cnt]=i;sp1[cnt]=(sp1[cnt-1]+i)%P;sp2[cnt]=(sp2[cnt-1]+i*i)%P;}for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;}}return;
}
ll S(ll x,ll y){if(pri[y]>=x)return 0;ll pos=(x>T)?ind2[n/x]:ind1[x];ll ans=g2[pos]-g1[pos]-(sp2[y]-sp1[y]);ans=(ans%P+P)%P;for(ll i=y+1;i<=cnt&&pri[i]*pri[i]<=x;i++){for(ll j=1,p=pri[i];p<=x;j++,p=p*pri[i]){ll w=p%P;(ans+=w*(w-1)%P*(S(x/p,i)+(j!=1))%P)%=P;}}return ans;
}
signed main()
{scanf("%lld",&n);T=sqrt(n);init(T);ll inv2=(P+1)/2,inv6=(P+1)/6;for(ll l=1,r;l<=n;l=r+1){ll x=n/l;r=n/(n/l);w[++tot]=n/l;x%=P;g1[tot]=x*(x+1)%P*inv2%P-1;g2[tot]=x*(x+1)%P*(2*x+1)%P*inv6%P-1;if(n/l<=T)ind1[n/l]=tot;else ind2[n/(n/l)]=tot;}for(ll i=1;i<=cnt;i++)for(ll j=1;j<=tot&&pri[i]*pri[i]<=w[j];j++){ll k=(w[j]/pri[i]);k=(k>T)?ind2[n/k]:ind1[k];(g1[j]+=P-pri[i]*(g1[k]-sp1[i-1])%P)%=P;(g2[j]+=P-pri[i]*pri[i]%P*(g2[k]-sp2[i-1])%P)%=P;}printf("%lld\n",(S(n,0)+1)%P);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客网【每日一题】7月8日 Alliances

来源&#xff1a;牛客网 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 5秒&#xff0c;其他语言10秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 树国是一个有n个城市的国家&#xff0c;城市编号…

【bfs】廉价最短路径(2013特长生 T4)

题目大意 给你一个图&#xff0c;每条边有一个代价&#xff0c;让你求0到1在最短路径的前提下的最小代价 解题思路 bfs同时求个最代价 代码 #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #de…

Ocelot简易教程(四)之请求聚合以及服务发现

上篇文章给大家讲解了Ocelot的一些特性并对路由进行了详细的介绍&#xff0c;今天呢就大家一起来学习下Ocelot的请求聚合以及服务发现功能。希望能对大家有所帮助。作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9695639.html请求聚合Ocelot允…

邓公数据结构C++语言版学习笔记1

1. 对于计算幂2n2^n2n的算法优化 暴力算法时间复杂度O(n)O(n)O(n) __int64 power2BF_I(int n) //幂函数2^n算法&#xff08;蛮力迭代版&#xff09;&#xff0c;n > 0{ __int64 pow 1; //O(1)&#xff1a;累积器刜始化为2^0while (0 < n --) //O(n)&#xff1a;迭代n轮…

【每日一题】7月9日题目 Color

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K Special Judge, 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 给一个没有重边的二…

【DP】K星人的语言(2020特长生 T3)

题目大意 给你一个字符串和若干单词&#xff0c;问你最少删除多少字符使其成为若干单词连在一起的字符串 解题思路 设fif_ifi​为前i个位置的最小代价 然后枚举每个单词即可 代码 #include<cstdio> #include<cstring> #include<iostream> #include<al…

HttpClientFactory系列二:集成Polly处理瞬态故障

前言&#xff1a;最近&#xff0c;同事在工作中遇到了使用HttpClient,有些请求超时的问题&#xff0c;辅导员让我下去调研一下&#xff0c;HttpClinet的使用方式已经改成了之前博客中提到的方式&#xff0c;问题的原因我已经找到了&#xff0c;就是因为使用了伪异步&#xff0c…

Loj#6053-简单的函数【Min25筛】

正题 题目链接:https://loj.ac/p/6053 题目大意 定义一个积性函数f(pc)pxorcf(p^c)p\ xor\ cf(pc)p xor c&#xff0c;求∑i1nf(i)\sum_{i1}^nf(i)∑i1n​f(i) 解题思路 异或这个东西不太好搞&#xff0c;要考虑怎么求出ggg数组。 当ppp为质数时f(p)p−1f(p)p-1f(p)p−1&am…

邓公数据结构C++语言版学习笔记——二叉树

二叉树的遍历 一. preorder——先序遍历VLR 1. 递归先序遍历 2. 迭代先序遍历 3.先序遍历图解 二. inorder——先序遍历LVR 1. 递归中序遍历 2.迭代中序遍历 3.迭代中序遍历优化空间复杂度 <1>定义直接后继 <2>借用直接后继优化算法 解释&#xff1a;…

二分图匹配--匈牙利算法

文章目录二分图&#xff1a;匹配匈牙利算法代码&#xff1a;二分图&#xff1a; 二分图是一个无向图&#xff0c;点集分成子集X和Y&#xff0c;图中每一条边都是一边在X一边在Y 当且仅当无向图G的每一个回路次数都是偶数时&#xff08;包括0&#xff09;&#xff0c;G就是一个…

CF757F-Team Rocket Rises Again【最短路,DAG支配树】

正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 nnn个点mmm条边的一张无向图&#xff0c;求删除sss以外的一个点改变sss到最多点的最短路。 解题思路 挺裸的一道题的&#xff0c;首先肯定要跑一遍最短路搞出最短路树。 然后如果最短路树上sss到某个点的路…

星座图(2020特长生 T4)

题目大意 给你一棵树&#xff0c;距离为2的两个点代价为wi∗wjw_i*w_jwi​∗wj​&#xff0c;问你最小代价和代价之和 解题思路 搜索这棵树&#xff0c;每次拿父亲和子节点一起计算即可 代码 #include<cstdio> #include<cstring> #include<algorithm> #de…

《Office 365开发入门指南》上市说明和读者服务

写在最开始的话拙作《Office 365开发入门指南》上周开始已经正式在各大书店、在线商城上市&#xff0c;欢迎对Office 365的开发、生态感兴趣的开发者、项目经理、产品经理参考本书&#xff0c;全面了解Office 365带来的全新机遇以及在具体业务应用开发中的场景。写作本书差不多…

简单理解手机快充

浅谈手机快充 背景 智能手机发展这么些年&#xff0c;屏幕显示越来越清晰&#xff0c;拍照像素越来越高&#xff0c;处理器性能越来越强&#xff0c;运行内存甚至开始超过PC&#xff0c;不过手机的续航还是一个问题&#xff1a;处理器性能以及一系列的增强无疑对电池是一个巨…

最短路模板

文章目录dijstraSPFAdijstra #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int MAXN10010,MAXM500010; int inf2147483647; struct XY{int w,to,pre; }e[MAXM];str…

P6499-[COCI2016-2017#2]Burza【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6499 题目大意 nnn个点的一棵树&#xff0c;开始有一个棋子在根处&#xff0c;开始先手选择一个点封锁&#xff0c;然后后手封锁棋子所在点然后移动一步到一个没有封锁的点&#xff0c;之后轮流进行。 先手不知道后手的移动…

各种dp优化

dp优化思路 dp三要素&#xff1a; 状态、决策、转移 dp优化思路&#xff1a; 减少状态总数减少决策时间&#xff08;减少每个状态转移的状态数&#xff09;减少转移时间 矩阵优化dp &#xff08;其实质是优化 “转移”&#xff09; 博客 数据结构优化dp &#xff08;其实…

裁缝师(2011特长生 T2)

题目大意 给你一个NM的布&#xff0c;你可以将最多L块布同时剪一刀&#xff0c;问你把他全部剪成11的最少要多少刀 解题思路#1 直接从中间剪&#xff0c;然后dfs求出一个图&#xff0c;然后每次找L个点去跑 代码#1 #include<queue> #include<cstdio> #include&l…

【送书活动】C# 程序员的自我修养

如果希望成为一个C# 高手&#xff0c;或者至少是合格的C# 程序员&#xff0c;应该懂些什么&#xff1f;《C#从现象到本质》&#xff08;以下简称本书&#xff09;试图回答这个问题。实际上&#xff0c;在本书问世之前&#xff0c;市面上已经有很多优秀的C# 书籍&#xff0c;例如…

【c++算法刷题笔记】——洛谷2

1. 洛谷练习——P1579 哥德巴赫猜想&#xff08;升级版&#xff09; 题目描述&#xff1a; 现在请你编一个程序验证哥德巴赫猜想。 先给出一个奇数n&#xff0c;要求输出3个质数&#xff0c;这3个质数之和等于输入的奇数。 输入格式&#xff1a; 仅有一行&#xff0c;包含一个…