一道神题。。。自己写出来以后被卡常了。。。荣获洛谷最差解。。。

思路还是比较好想,对于每个数 \(\sqrt{n}\) 分块,对于 \(\sqrt{n}\) 以内的数,我们可以直接求出来。对于 \(\sqrt{n}\) 以上的数,我们用莫队求。

不过空间 \(O(\frac {n\sqrt{10^9}}{\log n})\) 开不下,非常优秀。。。

那我们就把前 $100$ 个质数求出来,其他就用莫队好了,转移均摊是 \(O(1)\) 的吧。。。

常数巨大,本人没卡常。记得要等一个没人的时候提交。

\(Code\ Below:\)

// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair
#define F first
#define S second
using namespace std;
const int maxn=100000+10;
const int mod=19260817;
int n,m,lim,blo,a[maxn],cnt[maxn],sum[maxn][151],ans[maxn],now;
int inv[maxn],pri[maxn],vis[maxn],tot,num;
vector<pii> v[maxn];map<int,int> pos; struct Query{
int l,r,id;
}q[maxn]; inline bool cmp(const Query &a,const Query &b){
if((a.l-1)/blo!=(b.l-1)/blo) return (a.l-1)/blo<(b.l-1)/blo;
return a.r<b.r;
} inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
} inline void getpri(int n){
for(int i=2;i<=n;i++){
if(!vis[i]) pri[++tot]=i;
for(int j=1;j<=tot&&i*pri[j]<=n;j++){
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
} inline void pre(int val,int x){
int cnt;
for(int i=1;i<=tot;i++)
if(val%pri[i]==0){
cnt=0;
while(val%pri[i]==0) cnt++,val/=pri[i];
if(i<=150) sum[x][i]=cnt;
else {
if(pos.find(pri[i])==pos.end()) pos[pri[i]]=++num;
v[x].push_back(mp(pos[pri[i]],cnt));
}
}
if(val>1){
if(pos.find(val)==pos.end()) pos[val]=++num;
v[x].push_back(mp(pos[val],1));
}
} inline void add(int x){
for(int i=0,j=v[x].size();i<j;i++){
now=1ll*now*inv[cnt[v[x][i].F]]%mod;
cnt[v[x][i].F]+=v[x][i].S;
now=1ll*now*cnt[v[x][i].F]%mod;
}
} inline void del(int x){
for(int i=0,j=v[x].size();i<j;i++){
now=1ll*now*inv[cnt[v[x][i].F]]%mod;
cnt[v[x][i].F]-=v[x][i].S;
now=1ll*now*cnt[v[x][i].F]%mod;
}
} int main()
{
n=read(),m=read();blo=sqrt(n);
for(int i=1;i<=n;i++) a[i]=read(),lim=max(lim,a[i]);
getpri((int)sqrt(lim));
inv[0]=inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=1;i<=n;i++) pre(a[i],i);
for(int i=1;i<=n;i++)
for(int j=1;j<=150;j++) sum[i][j]+=sum[i-1][j];
for(int i=1;i<=n;i++) cnt[i]=1;
for(int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+m+1,cmp);
int L=1,R=0;now=1;
for(int i=1;i<=m;i++){
while(R<q[i].r) add(++R);
while(R>q[i].r) del(R--);
while(L<q[i].l) del(L++);
while(L>q[i].l) add(--L);
ans[q[i].id]=now;
for(int j=1;j<=150;j++) ans[q[i].id]=1ll*ans[q[i].id]*(sum[q[i].r][j]-sum[q[i].l-1][j]+1)%mod;
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

[Ynoi2015]此时此刻的光辉(莫队)的更多相关文章

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

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

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

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

  3. [Ynoi2015]此时此刻的光辉

    题目大意: 给定一个序列,每次询问一段区间的数的乘积的约数个数. 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐 ...

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

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

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

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

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

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

  7. 【洛谷5072】[Ynoi2015] 盼君勿忘(莫队)

    点此看题面 大致题意: 一个序列,每次询问一个区间\([l,r]\)并给出一个模数\(p\),求模\(p\)意义下区间\([l,r]\)内所有子序列去重后值的和. 题意转化 原来的题意看起来似乎很棘手 ...

  8. Luogu5072 [Ynoi2015]盼君勿忘 【莫队】

    题目描述:对于一个长度为\(n\)的序列,\(m\)次询问\(l,r,p\),计算\([l,r]\)的所有子序列的不同数之和\(\mathrm{mod} \ p\). 数据范围:\(n,m,a_i\l ...

  9. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

随机推荐

  1. DockerDesktop简单安装和使用

    一.在windows10下,安装DockerDesktop: 1.检查windows版本为企业版或专业版,并开启Hyper-v系统设置:电脑的控制面板->程序->启用或关闭Windows功 ...

  2. windows无法卸载jdk的解决方法

    装了java之后非常纠结的就是无法卸载,总不能因为卸载一个jdk去重装系统,但是看着它残存在那又非常不爽, 因为卸载会牵扯注册表等琐碎的东西,,,后来在官网发现神器一枚,此神器就是java卸载工具. ...

  3. 2019.01.21 洛谷P3919 【模板】可持久化数组(主席树)

    传送门 题意简述:支持在某个历史版本上修改某一个位置上的值,访问某个历史版本上的某一位置的值. 思路: 用主席树直接维护历史版本即可. 代码: #include<bits/stdc++.h> ...

  4. windows下Oracle数据库完全删除

    1.1   停止所有oracle的服务 1.2   删除安装路径 app及其下所有文件 1.3   删除注册表 regedit 进入 在下列列表中找到与oracle相关的注册表项删除 1.HKEY_L ...

  5. 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...

  6. IntelliJ IDEA 2017版 Spring5 java.lang.NoSuchMethodError: org.springframework.boot.SpringApplication.<init>([Ljava/lang/Object;)V

    错误是java.lang.NoSuchMethodError: org.springframework.boot.SpringApplication.<init>([Ljava/lang/ ...

  7. python,函数

    numpy.tile():参考https://www.jianshu.com/p/4b74a367833c numpy.argsort:argsort()里面传入参数只有数组时,返回的是数组值从小到大 ...

  8. 读《.net设计规范》

    一.影响软件品质的影响有哪些?比如性能.可靠性.安全性.依赖性管理等. 二.客户先行的编程——如果让你把自己的程序库提供的功能描述出来,并让一个开发人员在没有看过该程序库的前提下, 根据他认为该程序库 ...

  9. How to resolve "your security settings have blocked an untrusted application from running" in Mac

    If you encounter the error "your security settings have blocked an untrusted application from r ...

  10. Beta阶段第三篇Scrum冲刺博客-Day2

    1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:熟悉代码 郭琪容:了解复习模块需要的部分知识 ...