UOJ #188. 【UR #13】Sanrd (Min_25筛的广义应用)

本文深入探讨了一种求解次大质因数的算法,通过对Min_25筛算法的拓展应用,提出了基于枚举最小质因子的状态整除分块压缩DP方法。该方法通过记忆化搜索优化了求解过程,适用于处理与质数分布相关的复杂题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目
我琢磨着我怎么越来越会写标题了呢?
这个题很明显不是积性函数。
就像:51nod 1847 奇怪的数学题-对次小质因数下功夫。
而这个题是让我们求次大质因数。
考虑Min_25筛第二部分求答案的过程。
S(a,b)表示2~a中 m i n p r i m e > = p r i m e b minprime >= prime_b minprime>=primeb的答案。
那么S(a,b)可以通过(套路)枚举质数和质数的次方,如果当前质数要当作次大质因数, S ( a , b ) + = p r i ∗ 在 p r b 和 a p r i k 之 间 的 质 数 数 量 S(a,b) += pr_i * 在pr_b和{\frac a{pr_i^k}}之间的质数数量 S(a,b)+=priprbprika,如果不作,那就简单的 S ( a , b ) + = S ( a p r i , b + 1 ) S(a,b) += S(\frac a{pr_i},b+1) S(a,b)+=S(pria,b+1)
这个。。。由此我们推出结论,和所包含质数有关系的题,可以使用类Min_25的dp顺序记忆化搜索。
我们不妨叫这:基于枚举最小质因子的状态整除分块压缩DP

AC Code:

#include<bits/stdc++.h>
#define maxn 700005
#define LL long long
using namespace std;

LL n,s0[maxn],a[maxn],sm0[maxn],pr[maxn],cnt_pr;
int sqt,cnt;
inline int id(LL x){ return x<=sqt?x:cnt-n/x+1; }

LL S(LL a,LL b)
{
	if(a < pr[b]) return 0;
	int pos = id(a);
	LL ret = 0;
	for(int i=b;i<=cnt_pr&&pr[i]*pr[i]<=a;i++)
		for(LL x=pr[i],lim=a/pr[i];x<=lim;x*=pr[i])
			ret += S(a/x,i+1) + pr[i]*(s0[id(a/x)]-i+1);
	return ret;
}

LL Solve(LL num)
{
	n = num;
	sqt = sqrt(num);
	cnt = cnt_pr = 0;
	for(LL i=1;i<=n;i++)
		a[++cnt] = i = n/(n/i),
		s0[cnt] = i-1;
	for(LL i=1;i<=sqt;i++)
		if(s0[i]!=s0[i-1])
		{
			pr[++cnt_pr] = i;
			sm0[cnt_pr] = sm0[cnt_pr-1] + 1;
			for(LL j = cnt , lim = i * i; a[j] >= lim ; j--)
				s0[j] -= s0[id(a[j]/i)] - sm0[cnt_pr-1];
		}
		
	return S(n,1);
}

int main()
{
	LL l,r;
	scanf("%lld%lld",&l,&r);
	printf("%lld\n",Solve(r)-Solve(l-1));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值