ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P5325 【模板】Min_25筛

2019-08-10 11:06:58  阅读:188  来源: 互联网

标签:25 P5325 prim Min 合数 29% 20% 28x% 质数


传送门

要求求积性函数 f(x) 的前缀和,f(prim) 是一个关于prim的简单多项式,f(prim^k) 可以快速计算

求法:

Min25 筛分为两部分,第一部分处理素数的幂在 \left \lfloor \frac{n}{i} \right \rfloor 的前缀和

即     f_k(n)=\sum_{p<=n}p^k

Min25 的核心思想就是考虑小于根号n的质数可以出去大于根号n的合数的贡献

因此我们可以利用这个性质避免计算大于根号n的数的幂

设 f(i,j) 为已经筛了 j 个倍数,<= i 的数的 k 次幂和

f(i,j)=\sum_{x=2}^ix^k[(Min(x)>p_j) or (x\in p)]

s(i) 为前 i 个质数的 k 次幂和, s(i)=\sum_{x=1}^{i} p_i^k

换句话说,f 的作用就是一个质数一个质数去脱合数的衣服,当考虑完小于根号n的质数后,所有合数也被扒完了

f(i,j)=f(i,j-1)-p_j^k(f(\left \lfloor \frac{i}{p_j} \right \rfloor, j-1) - s(j-1))

考虑多加一个质数会多拔去多少合数的贡献,这些贡献就是

\sum (p_j*x)^k = p_j^k \sum x^k(p_j*x <=i,Min(x)>p_{j-1})

但这样会把质数的贡献减去,所以我们要加上质数的贡献

这样以来我们已经可以处理一些问题了,比如说 <=n的质数个数(0次幂),质数和 (1次幂)

第二部分就是把合数的贡献用积性函数的性质加回去

g(i,j) 表示 2 -- i 所有 Min(x) >= prim(j) 的和

g(i,j)=\sum_{x=2}^if(x)[(x\in P)or(Min(x)>=p_j)]

递推分为两部分考虑,一是大于等于pi 的质数,一是合数

质数的贡献我们已经知道,现在考虑如何加上合数的贡献,自己枚举合数的最小质因子与次数

\sum f(p_i^e*x)= f(p_i^e)\sum f (x)(x*p_i^e<=n,Min(x)>p_i)

于是有   g(n, i)=f(n,cnt)-s(i-1)+\sum_{e=1,k>i}^{p_i^{e}<=n}f(p_i^e)g(\frac{n}{p_e^i}, k)+\sum_{e=2}^{p_i^e<=n}f(p_i^e)

后面一坨是因为没有考虑一个质数的次方的贡献

 

一些细节

我们发现求 f 的时候,n 只需要用到所有 \left \lfloor \frac{n}{i} \right \rfloor 的状态,而 \left \lfloor \frac{\left \lfloor \frac{a}{b}\right \rfloor}{c} \right \rfloor=\left \lfloor \frac{a}{bc} \right \rfloor 

于是我们可以直接整除分块预处理 n / i 的所有状态然后离散化

//Part 1
for(ll l = 1, r; l <= n; l = r + 1){
    ll v = n / l; r = n / v; 
	if(v <= S) id1[v] = ++m; else id2[n / v] = ++m;
	w[m] = v; ll x = v % Mod;
	f1[m] = (x * (x+1) / 2) % Mod - 1; 
	f2[m] = mul(mul(x, x+1), mul(mul(2, x)+1, inv6)) - 1;
}
for(int i = 1; i <= tot; i++){
	for(int j = 1; j <= m && prim[i] * prim[i] <= w[j]; j++){
		ll k = Id(w[j] / prim[i]);
		f1[j] = dec(f1[j], mul(prim[i], dec(f1[k], s1[i-1])));
		f2[j] = dec(f2[j], mul(mul(prim[i], prim[i]), dec(f2[k], s2[i-1])));
	}
} 
// Part 2
ll Solve(ll x, int p){
	ll k = Id(x), ans = dec(dec(f2[k], f1[k]), dec(s2[p-1], s1[p-1]));
	for(int i = p; i <= tot; i++){
		if(prim[i] * prim[i] > x) break;
		for(ll e = 1, l = prim[i]; l <= x; l *= prim[i], e++){
			ll v = l % Mod;
			if(l * prim[i] <= x) ans = add(ans, mul(f(v), Solve(x / l, i + 1)));
			if(e > 1) ans = add(ans, f(v));
		}
	} return ans;
}

 

标签:25,P5325,prim,Min,合数,29%,20%,28x%,质数
来源: https://blog.csdn.net/sslz_fsy/article/details/99055762

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有