[Ynoi2015]此时此刻的光辉(莫队)
一道神题。。。自己写出来以后被卡常了。。。荣获洛谷最差解。。。
思路还是比较好想,对于每个数 \(\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]此时此刻的光辉(莫队)的更多相关文章
- Luogu5071 [Ynoi2015]此时此刻的光辉 【莫队】
题目链接:洛谷 这个跟上上个Ynoi题目是一样的套路,首先我们知道\(n=\prod p_i^{\alpha_i}\)时\(d(n)=\prod (\alpha_i+1)\). 首先对所有数分解质因数 ...
- 洛谷 P5071 - [Ynoi2015] 此时此刻的光辉(莫队)
洛谷题面传送门 一道其实算得上常规的题,写这篇题解是为了总结一些数论中轻微(?)优化复杂度的技巧. 首先感性理解可以发现该问题强于区间数颜色问题,无法用常用的 log 数据结构维护,因此考虑分块/莫队 ...
- [Ynoi2015]此时此刻的光辉
题目大意: 给定一个序列,每次询问一段区间的数的乘积的约数个数. 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐 ...
- 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉
众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题(我也只会莫队) 我博客里对莫队的简单介绍 一个数N可以分解成\(p_1^{c_1}p_2^{ ...
- P5071 [Ynoi2015]此时此刻的光辉
传送门 lxl大毒瘤 首先一个数的因子个数就是这个数的每个质因子的次数+1的积,然后考虑把每个数分解质因子,用莫队维护,然后我交上去就0分了 如果是上面那样的话,我们每一次移动指针的时间复杂度是O(这 ...
- 洛谷P5072 [Ynoi2015]盼君勿忘 [莫队]
传送门 辣鸡卡常题目浪费我一下午-- 思路 显然是一道莫队. 假设区间长度为\(len\),\(x\)的出现次数为\(k\),那么\(x\)的贡献就是\(x(2^{len-k}(2^k-1))\),即 ...
- 【洛谷5072】[Ynoi2015] 盼君勿忘(莫队)
点此看题面 大致题意: 一个序列,每次询问一个区间\([l,r]\)并给出一个模数\(p\),求模\(p\)意义下区间\([l,r]\)内所有子序列去重后值的和. 题意转化 原来的题意看起来似乎很棘手 ...
- Luogu5072 [Ynoi2015]盼君勿忘 【莫队】
题目描述:对于一个长度为\(n\)的序列,\(m\)次询问\(l,r,p\),计算\([l,r]\)的所有子序列的不同数之和\(\mathrm{mod} \ p\). 数据范围:\(n,m,a_i\l ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
随机推荐
- 新版的Bing Developer Assistant 已发布,去掉了Beta
网址:https://visualstudiogallery.msdn.microsoft.com/a1166718-a2d9-4a48-a5fd-504ff4ad1b65 新加特性: New Vis ...
- TensorFlow安装时错误CondaValueError: prefix already exists: G:\softs\Anaconda\envs\tensorflow
TensorFlow安装时,TensorFlow环境已经调好了,就是下面的第(3)步, 可我自己偏偏选了个Python3.7,因为检测到自己的Python最新版本为3.7,就手贱安了TensorFlo ...
- mysql 批量杀进程
select concat('KILL ',id,';') from information_schema.processlist where user='root';
- 2018.12.17 hdu2138 How many prime numbers(miller-rbin)
传送门 miller−rabbinmiller-rabbinmiller−rabbin素数测试的模板题. 实际上miller−rabinmiller-rabinmiller−rabin就是利用费马小定 ...
- JSP错误
1.<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncodin ...
- Java设计模式——结构型模式
Java设计模式中共有7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,其关系如下面的图:1.适配器模式 适配器模式将某个类 ...
- 苹果电脑thunderbolt连接两台电脑启动方法
thunderbolt:首先连接连台电脑 然后开启可以启动的电脑, 关闭无法启动的电脑. 接着 按一下法启动的电脑电源—> 然后按t键 会在另外一台可以启动的电脑上出现,无法启动电脑的磁盘. 就 ...
- vue 开发系列(三) vue 组件开发
概要 vue 的一个特点是进行组件开发,组件的优势是我们可以封装自己的控件,实现重用,比如我们在平台中封装了自己的附件控件,输入控件等. 组件的开发 在vue 中一个组件,就是一个独立的.vue 文件 ...
- mysql (_mysql_exceptions.OperationalError) (1055, "Expression #1 of SELECT list is not in GROUP BY clause
sudo gedit /etc/mysql/my.cnf在打开的my.cnf文件中添加 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 保存,退 ...
- 20155205 《Java程序设计》实验三(敏捷开发与XP实践)实验报告
20155205 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 (一)使用Code菜单 在IDEA中使用工具(Code->Reformate Code ...