题目传送门


分析

约数个数就是 \(\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. 项目实战:Qt西门子PLC通讯调试和模拟工具(包含PLC上位机通讯,PLC服务器)

      前言   西门西PLC.台达触摸屏.法兰克机床等等多年以前玩得比较多,改造机床.维修机床.给机床编程等等,没事还能车个零件啥的,对于多年以前的研发改造,有时间就重新整理下.  先上点有历史年代感的 ...

  2. 图书管理系统---基于form组件和modelform改造添加和编辑

    添加 基于form组件改造 步骤1 1.为了区分自己写的form类和视图逻辑,所以工作中需要区分开来,那么就可以在应用下创建一个叫utils的文件夹,专门存放我们写的form类,py文件名随便起 2. ...

  3. 【Azure 应用服务】Azure Function (PowerShell) 执行时报错 "out of memory"

    问题描述 在Azure Function App服务中,创建一个PowerShell脚本的函数,遇见了OOM(Out Of Memory)的异常报错: 2022-01-10T07:44:37 Welc ...

  4. MacOS安装gRPC C++

    从源码安装gRPC C++ 环境准备 $ [sudo] xcode-select --install $ brew install autoconf automake libtool shtool $ ...

  5. 实现一个 SEO 友好的响应式多语言官网 (Vite-SSG + Vuetify3) 我的踩坑之旅

    在 2023 年的年底,我终于有时间下定决心把我的 UtilMeta 项目官网 进行翻新,主要的原因是之前的官网是用 Vue2 实现的一个 SPA 应用,对搜索引擎 SEO 很不友好,这对于介绍项目的 ...

  6. Linux性能监控(二)-top

    top命令可以用来监控服务器CPU.内存的运行情况,是Linux一个经常使用到的命令. 基本用法 第一行 显示当前系统运行信息,系统当前时间是23:23:21,运行了315days,当前有2个用户登录 ...

  7. Java使用Steam流对数组进行排序

    原文地址:Java使用Steam流对数组进行排序 - Stars-One的杂货小窝 简单记下笔记,不是啥难的东西 sorted()方法里传了一个比较器的接口 File file = new File( ...

  8. 专访OV季军|毕业转为freelancer,他如何斩获大量CG奖项?

    "新锐先锋,玩转未来"--首届实时渲染3D动画创作大赛由瑞云科技主办,英伟达.青椒云.3DCAT实时渲染云协办,戴尔科技集团.Reallusion.英迈.万生华态.D5渲染器.中视 ...

  9. Python实现端口扫描

    实验环境 攻击主机IP:172.18.53.145 目标主机IP:172.18.53.28 脚本编写 思路:使用TCP协议遍历连接目标的所有端口,如果连接成功说明该端口开放,为了提升效率,使用多线程执 ...

  10. 你是怎么理解ES6中 Generator的?使用场景?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段: 回 ...