
题目链接:https://nanti.jisuanke.com/t/42387
题解:乍一看这道题就是质因数分解+线段树,质因数分解就是把一个数写出素数乘积的形式,这样就方便求出pot函数对应的m,而线段树就是在logn时间里找到询问区间里最大的m,总的时间复杂度是nlogn
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e5+5;//n的最大值
/*只用线段树一般把数组大小定义为Maxn<<2,避免数组越界的问题*/
int Maxprime[Maxn<<2][4]={
0};//储存区间最大m
int Maxlazy[Maxn<<2][4]={
0};//用于懒加载记录
int prime[4]={
2,3,5,7};//10以内的素数
/*因为这题中乘数x最大为10,所以它的素因子最多不过2,3,5,7四个*/
void pushdown(int dep,int i)
{
/*懒加载处理*/
if(Maxlazy[dep][i])//如果我存在素因子prime[i]的个数没有给子区间,那么就给
{
Maxlazy[dep*2+1][i]+=Maxlazy[dep][i];

这篇博客介绍了如何利用质因数分解和线段树数据结构来高效地处理动态查询一个数的质因子个数问题。通过质因数分解预先计算每个数的质因子分布,然后借助线段树进行区间查询和更新操作,使得时间复杂度达到O(n log n)。
最低0.47元/天 解锁文章
7万+





