题目传送门


分析

约数个数就是 \(\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. 【Android逆向】脱壳项目frida_dump 原理分析

    脱dex核心文件dump_dex.js 核心函数 function dump_dex() { var libart = Process.findModuleByName("libart.so ...

  2. 使用winsw将jar包注册成windows服务

    使用winsw将jar包注册成windows服务 注:exe文件作用:使用winsw将jar包注册成windows服务(下载地址https://github.com/winsw/winsw/relea ...

  3. 【华为机试ACM基础#01】字符串最后一个单词长度、计算某字符出现次数、提取不重复的整数(熟悉字符/字符串/整数的输入)

    字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000.(注:字符串末尾不以空格为结尾) 输入描述: 输入一行,代表要计算的字符串,非空,长度小于5000 ...

  4. 【Azure 云服务】如果云服务证书过期会有什么影响,证书时间应该如何查看

    问题描述 如果云服务证书过期会有什么影响,证书时间应该如何查看 问题答案 在云服务中,有两种证书:服务证书 和 管理证书 什么是服务证书? 通过浏览器访问云服务中的服务(Web Role)时候所使用的 ...

  5. [逆向] FS寄存器

    偏移 说明 00 指向SEH链表指针 04 线程堆栈顶部(地址最小) 08 线程堆栈底部(地址最大) 0c SubSystemTib 10 FiberData 14 ArbitraryUserPoin ...

  6. 【专业技能】程序员的软件工程素养之画好 UML 时序图

    目录 前言 一.认识时序图 1.1时序图元素 1.2怎么使用 二.画好时序图 2.1一般步骤 2.2举个例子 2.3推荐工具 三.其它作用 四.文章小结 前言 笔者在本科的时候上过软件工程的专业课,也 ...

  7. Python魔法:20个让你编程事半功倍的奇淫技巧(建议收藏)

    Python作为一门灵活.充满技巧的语言,有着很多奇技淫巧,今天小编就跟大家分享一下在平时工作中所积累的技巧,这里面既有语法上的技巧,也有库函数的应用,可以帮助大家在平时的工作中提升效率,规避某些错误 ...

  8. SSH原理与实践(三)安装和使用

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 在之前SSH原理与实践系列文章中,我们主要讲解了SSH协议的原理 ...

  9. 将Abp移植进.NET MAUI项目(二):配置与基类编写

    ​ 因为我们要做一个数据持久化型的小应用,所以在完成Abp功能的集成后,我们需要做数据库相关的配置工作 配置数据库 在MauiBoilerplate.Core项目中,添加两个实体类: 我们简单的写一个 ...

  10. 【Azure Power BI】Power BI获取SharePoint List列表后,如何展开List/Table中的字段,以及使用逗号拼接为一个字符串

    问题描述 Power BI获取SharePoint List列表作为数据源.但是在数据源中,有Table属性值,有List属性值.如果直接展开,则会形成"笛卡尔"集的效果,变成N多 ...