#莫队,根号分治#洛谷 5071 [Ynoi2015] 此时此刻的光辉
分析
约数个数就是 \(\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] 此时此刻的光辉的更多相关文章
- 洛谷 P5071 - [Ynoi2015] 此时此刻的光辉(莫队)
洛谷题面传送门 一道其实算得上常规的题,写这篇题解是为了总结一些数论中轻微(?)优化复杂度的技巧. 首先感性理解可以发现该问题强于区间数颜色问题,无法用常用的 log 数据结构维护,因此考虑分块/莫队 ...
- 洛谷P5072 [Ynoi2015]盼君勿忘 [莫队]
传送门 辣鸡卡常题目浪费我一下午-- 思路 显然是一道莫队. 假设区间长度为\(len\),\(x\)的出现次数为\(k\),那么\(x\)的贡献就是\(x(2^{len-k}(2^k-1))\),即 ...
- [Ynoi2015]此时此刻的光辉(莫队)
一道神题...自己写出来以后被卡常了...荣获洛谷最差解... 思路还是比较好想,对于每个数 \(\sqrt{n}\) 分块,对于 \(\sqrt{n}\) 以内的数,我们可以直接求出来.对于 \(\ ...
- Luogu5071 [Ynoi2015]此时此刻的光辉 【莫队】
题目链接:洛谷 这个跟上上个Ynoi题目是一样的套路,首先我们知道\(n=\prod p_i^{\alpha_i}\)时\(d(n)=\prod (\alpha_i+1)\). 首先对所有数分解质因数 ...
- Codeforces 1476G - Minimum Difference(带修莫队+根号平衡)
Codeforces 题目传送门 & 洛谷题目传送门 震惊!我竟然独立切掉了这道 *3100 的题! 虽然此题难度的确虚高,感觉真实评分也就 2800~2900 罢.但感觉还是挺有成就感的( ...
- 浅谈分治 —— 洛谷P1228 地毯填补问题 题解
如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子 ...
- 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)
洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...
- 洛谷:P5072 [Ynoi2015]盼君勿忘
原题地址:https://www.luogu.org/problem/P5072 题目简述 给定一个序列,每次查询一个区间[l,r]中所有子序列分别去重后的和mod p 思路 我们考虑每个数的贡献.即 ...
- 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉
众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题(我也只会莫队) 我博客里对莫队的简单介绍 一个数N可以分解成\(p_1^{c_1}p_2^{ ...
- P5071 [Ynoi2015]此时此刻的光辉
传送门 lxl大毒瘤 首先一个数的因子个数就是这个数的每个质因子的次数+1的积,然后考虑把每个数分解质因子,用莫队维护,然后我交上去就0分了 如果是上面那样的话,我们每一次移动指针的时间复杂度是O(这 ...
随机推荐
- pymysql基本语法,sql注入攻击,python操作pymysql,数据库导入导出及恢复数据---day38
1.pymysql基本语法 # ### python操作mysql import pymysql ''' # ### 1.基本语法 #(1) 创建连接 host user password datab ...
- 如何将 IPhone 的文件导入 Linux
如何将 IPhone 的文件导入 Linux 完全免费方案. 方法一: 使用 Koder 的 Local File Access 功能 这方法不需要在 Linux 端做任何配置. IPhone 端 安 ...
- 【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动
什么是 Azure SignalR 服务? Azure SignalR Service 简化了通过 HTTP 向应用程序添加实时 Web 功能的过程. 这种实时功能允许服务将内容更新推送到连接的客户端 ...
- C++ STL之 map 学习笔记
•何为 map? map 是 STL 的一个关联容器,它提供一对一的数据处理,map 中存放的是一个 key-value键值对,其类型可以自己定义: 第一个可以称为关键字,每个关键字在 map 中只能 ...
- Java基础全程复习笔记(值得参考)
Java基础复习笔记 第01章:Java语言概述 1. Java基础学习的章节划分 第1阶段:Java基本语法 Java语言概述.Java的变量与进制.运算符.流程控制语句(条件判断.循环结构).br ...
- Vue 动态插入组件 用js函数的方式
Vue 动态插入组件 用js函数的方式 第一步 import vue组件 第二步 Vue把组件扩展进去 第三步 创建实例 第四步 将组件的el挂载到document.body上 第五步 设置组件内部d ...
- pcm5102芯片解析之基本概念
一 前记 1 在音频领域深耕,那就要不断的前行.最近有几个项目需要用到pcm5102这颗料,藉此机会,针对这个料进行深入的研究一下.做一一些简要的分析. 二 概念 音频芯片的指标,其实,很多年都没啥变 ...
- 基于C语言的串口AT指令发送实例解析
一 知识点 1 AI指令后面一定要加 \n\r 2 注意AT指令里面待双引号的这种,要使用斜杠隔开. 二 源码: void Set_Pdu_Mode(void) { u8 a = 1; if(atKe ...
- Kettle实战视频教程
kettle实战视频教程 欢迎关注笔者的公众号: java大师, 每日推送java.kettle运维等领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!!个人网站: http://w ...
- 记一次配置mybatis plus报错有感
参考,欢迎点击原文:https://blog.csdn.net/wwrzyy/article/details/86034458(问题原因) https://www.jianshu.com/p/28d6 ...