题目传送门


分析

约数个数就是 \(\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. win32-FileTimeToSystemTime的使用

    #include <Windows.h> #include <iostream> #include <string> #pragma warning(disable ...

  2. kafka学习笔记03-消息生产者producer

    kafka学习笔记03-消息生产者producer 发送消息整体流程示意图 消息发送的流程示意图: (From:High-level overview of Kafka producer compon ...

  3. centos7 安装vmware tool 遇到遇到 kernel-headers 问题修复

    安装 vmware tool 步骤 1. cp VMwareTools-10.3.25-20206839.tar.gz 到 用户目录下 2. tar zxf VMwareTools-10.3.25-2 ...

  4. virtualapp安装应用流程源码分析

    1. HomeActivity 为处理的入口 @Override protected void onActivityResult(int requestCode, int resultCode, In ...

  5. locals()用法

    views.py代码 def test(request): if request.method == 'GET': return render(request,'test.html') elif re ...

  6. 数据抽取平台pydatax介绍--实现和项目使用

    数据抽取平台pydatax实现过程中,有2个关键点: 1.是否能在python3中调用执行datax任务,自己测试了一下可以,代码如下:    这个str1就是配置的shell文件 try: resu ...

  7. 【八股cover#3】计网 Q&A与知识点

    计网知识点Q&A 简历cover 1.TCP/IP网络模型 网络模型 ​ TCP/IP 协议族,它是一个分层.多协议的通信体系. ​ TCP/IP协议族是一个四层协议系统,自底而上分别是数据链 ...

  8. 适配http分发Directory.Build.props文件,需要替换默认的微软sdk:8.0映像

    背景 我们是把Directory.Build.props及其Import的文件,都放在http://dev.amihome.cn 那么docker build的时候,也是需要下载Directory.B ...

  9. C++//vector存放自定义数据类型

    1 //vector存放自定义数据类型 2 3 #include <iostream> 4 #include <string> 5 #include<fstream> ...

  10. Git常见的面试题

    在软件开发领域,Git是一个极为重要的版本控制系统,几乎每个开发者都需要掌握它.因此,在面试过程中,Git常常成为了面试官们用来考察候选人技能和经验的重要工具之一.以下是一些常见的Git面试题,希望它 ...