题目传送门


分析

约数个数就是 \(\prod{(c+1)}\),但是带 \(log\) 会TLE,

考虑将每个数分成 \(\leq \sqrt[3]{n}\) 和 \(>\sqrt[3]{n}\) 两部分,

前面这一部分直接预处理,后面这一部分最多存在两个数,所以用莫队直接维护即可


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#include <algorithm>
#define rr register
using namespace std;
const int N=100011,mod=19260817,M=31621; struct rec{int l,r,rk;}q[N]; bool v[N];
int cnt[N<<1],inv[N<<1],f[N][3],s[170][N],Q,Cnt,ans[N],pos[N],bl,now=1,b[N<<1],n,m,prime[M];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
bool cmp(rec a,rec b){
if (pos[a.l]^pos[b.l]) return a.l<b.l;
return pos[a.l]&1?a.r<b.r:a.r>b.r;
}
inline void update(int x,int z){
rr int f0=cnt[f[x][1]],f1=cnt[f[x][2]];
for (rr int i=1;i<=f[x][0];++i)
if (f[x][i]) cnt[f[x][i]]+=z;
rr int f2=cnt[f[x][1]],f3=cnt[f[x][2]];
if (f[x][1]==f[x][2]) now=1ll*now*inv[f0]%mod*f2%mod;
else now=1ll*now*inv[f0]%mod*inv[f1]%mod*f2%mod*f3%mod;
}
signed main(){
for (rr int i=2;i<=M;++i){
if (!v[i]) prime[Cnt++]=i;
for (rr int j=0;j<Cnt&&prime[j]*i<=M;++j){
v[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
n=iut(),Q=iut(),bl=sqrt(n),inv[0]=inv[1]=1;
for (rr int i=1;i<=n;++i){
rr int x=iut();
for (rr int j=0;j<170;++j)
while (x%prime[j]==0)
++s[j][i],x/=prime[j];
for (rr int j=170;j<Cnt&&prime[j]*prime[j]<=x;++j)
while (x%prime[j]==0) f[i][++f[i][0]]=prime[j],x/=prime[j];
if (x>1) f[i][++f[i][0]]=x;
}
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=f[i][0];++j) b[++m]=f[i][j];
for (rr int i=2;i<=m+1;++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
sort(b+1,b+1+m),m=unique(b+1,b+1+m)-b-1;
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=f[i][0];++j)
f[i][j]=lower_bound(b+1,b+1+m,f[i][j])-b;
for (rr int i=0;i<=m;++i) cnt[i]=1;
for (rr int i=0;i<170;++i)
for (rr int j=2;j<=n;++j)
s[i][j]+=s[i][j-1];
for (rr int i=1;i<=Q;++i)
q[i]=(rec){iut(),iut(),i},ans[i]=1;
for (rr int i=1;i<=n;++i) pos[i]=(i-1)/bl+1;
sort(q+1,q+1+Q,cmp);
rr int L=q[1].l,R=L-1;
for (rr int i=1;i<=Q;++i){
while (L>q[i].l) update(--L,1);
while (R<q[i].r) update(++R,1);
while (L<q[i].l) update(L++,-1);
while (R>q[i].r) update(R--,-1);
ans[q[i].rk]=now;
}
for (rr int i=1;i<=Q;++i)
for (rr int j=0;j<170;++j)
ans[q[i].rk]=1ll*ans[q[i].rk]*(s[j][q[i].r]-s[j][q[i].l-1]+1)%mod;
for (rr int i=1;i<=Q;++i) print(ans[i]),putchar(10);
return 0;
}

#莫队,根号分治#洛谷 5071 [Ynoi2015] 此时此刻的光辉的更多相关文章

  1. 洛谷 P5071 - [Ynoi2015] 此时此刻的光辉(莫队)

    洛谷题面传送门 一道其实算得上常规的题,写这篇题解是为了总结一些数论中轻微(?)优化复杂度的技巧. 首先感性理解可以发现该问题强于区间数颜色问题,无法用常用的 log 数据结构维护,因此考虑分块/莫队 ...

  2. 洛谷P5072 [Ynoi2015]盼君勿忘 [莫队]

    传送门 辣鸡卡常题目浪费我一下午-- 思路 显然是一道莫队. 假设区间长度为\(len\),\(x\)的出现次数为\(k\),那么\(x\)的贡献就是\(x(2^{len-k}(2^k-1))\),即 ...

  3. [Ynoi2015]此时此刻的光辉(莫队)

    一道神题...自己写出来以后被卡常了...荣获洛谷最差解... 思路还是比较好想,对于每个数 \(\sqrt{n}\) 分块,对于 \(\sqrt{n}\) 以内的数,我们可以直接求出来.对于 \(\ ...

  4. Luogu5071 [Ynoi2015]此时此刻的光辉 【莫队】

    题目链接:洛谷 这个跟上上个Ynoi题目是一样的套路,首先我们知道\(n=\prod p_i^{\alpha_i}\)时\(d(n)=\prod (\alpha_i+1)\). 首先对所有数分解质因数 ...

  5. Codeforces 1476G - Minimum Difference(带修莫队+根号平衡)

    Codeforces 题目传送门 & 洛谷题目传送门 震惊!我竟然独立切掉了这道 *3100 的题! 虽然此题难度的确虚高,感觉真实评分也就 2800~2900 罢.但感觉还是挺有成就感的( ...

  6. 浅谈分治 —— 洛谷P1228 地毯填补问题 题解

    如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子 ...

  7. 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)

    洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...

  8. 洛谷:P5072 [Ynoi2015]盼君勿忘

    原题地址:https://www.luogu.org/problem/P5072 题目简述 给定一个序列,每次查询一个区间[l,r]中所有子序列分别去重后的和mod p 思路 我们考虑每个数的贡献.即 ...

  9. 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉

    众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题(我也只会莫队) 我博客里对莫队的简单介绍 一个数N可以分解成\(p_1^{c_1}p_2^{ ...

  10. P5071 [Ynoi2015]此时此刻的光辉

    传送门 lxl大毒瘤 首先一个数的因子个数就是这个数的每个质因子的次数+1的积,然后考虑把每个数分解质因子,用莫队维护,然后我交上去就0分了 如果是上面那样的话,我们每一次移动指针的时间复杂度是O(这 ...

随机推荐

  1. djang中orm使用iterator()

    当查询结果有很多对象时,QuerySet的缓存行为会导致使用大量内存.如果你需要对查询结果进行好几次循环,这种缓存是有意义的,但是对于 queryset 只循环一次的情况,缓存就没什么意义了.在这种情 ...

  2. 第140篇:微信小程序的登录流程

    好家伙,补补补   顶不住了,跑不掉了,这部分的知识还是要补上   来看看微信小程序登录的完整流程   最左边的一列就是前端负责的部分了 几个关键的参数: code:一个用户登录凭证,就是一个临时的t ...

  3. SpringMvc原理概述

    目录 MVC整体架构和流程 SpringMVC 框架组件概述 SpringMVC 配置详解 springmvc.xml MVC整体架构和流程 用户发送请求至前端控制器 DispatcherServle ...

  4. 【Azure API 管理】APIM的容量指标(Capacity)数据异常高的情况记录

    问题描述 APIM从标准版降级到基础版,在没有用户使用的情况,Capacity的指标平均显示在80%以上. 这是什么异常情况呢? 问题分析 APIM的容量指标(Capacity)是 API 管理实例中 ...

  5. JVM解析

    synize锁升级

  6. Redis集群Cluster

    Redis Cluster 是社区版推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好 ...

  7. redis分片sharding实现原理

    为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在 ...

  8. Vite + Vue3.0 项目初始化

    主要是冷启动,实际中项目非常庞大,现在1w的笔记本,每次冷启动,也得等一下,所以准备转型 Vite+Vue3.0,毕竟Vite不支持Vue2.0,这就只能下个项目的时候再启动了. $ npm init ...

  9. Windows改变终端字体后,终端一片黑 的解决办法

    使用Windows终端的时候总觉得字体不好看,于是乎按照网上的教程改了一下 注册表 计算机\HKEY_CURRENT_USER\Console%SystemRoot%_system32_cmd.exe ...

  10. java基础 韩顺平老师的 面向对象(中级) 自己记的部分笔记

    272,包基本介绍 包的三大作用 1,区分相同的类   2,当类很多时,可以很好的管理类   3,控制访问范围 包基本用法 package com.hspedu; 说明: 1,package 关键字, ...