众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评

原题传送门

一看这题没有修改操作就知道这是莫队题(我也只会莫队)

我博客里对莫队的简单介绍

一个数N可以分解成\(p_1^{c_1}p_2^{c_2}…p_m^{c_m}\)

它的约数个数就是\((c_1+1)(c_2+1)…(c_m+1)\)

我们考虑先把每一个数分解质因数

用试除法会使你tle到没救,所以我们要用pollard's Rho来解决问题

(用质因数分解是因为\(10^9<2*3*5*7*11*13*17*19*23*29\),质因数数量较少)

分解质因数后离散化,否则mle飞天

进行莫队,正常计算贡献,你交一发,会发现只有82(73),因为这个算法需要扫描每个数的每个质因子

我们很容易想到,一百(五百)以下的质数很多,而且他们作为质因子的次数也很多,所耗时间巨大

所以我们考虑将一百(五百)以下的质因数建立前缀和

这样就珂以过此题了(话说我pollard's Rho写得好丑啊)

#include <bits/stdc++.h>
#define N 100005
#define mod 19260817
#define ll long long
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline int Max(register int x,register int y)
{
return x>y?x:y;
}
ll Test[10]={5,61,24251,19260817};
inline int mul(register int a,register int b,register int m)
{
int d=((long double)a/m*b+1e-8);
int r=a*b-d*m;
return r<0?r+m:r;
}
inline int Pow(register int a,register int b,register int m)
{
ll r=1;
for(;b;b>>=1,a=mul(a,a,m))
if(b&1)
r=mul(r,a,m);
return r;
}
inline bool Query(register int P)
{
if(P==1)
return 0;
if(P==2||P==3||P==5||P==7)
return 1;
if(!(P&1)||(P%3==0)||(P%5==0)||(P%7==0))
return 0;
int t=P-1;
int k=0;
while(!(t&1))
++k,t>>=1;
for(register int i=0;i<3;++i)
{
if(P==Test[i])
return 1;
int a=Pow(Test[i],t,P),nxt=a;
for(register int j=1;j<=k;++j)
{
nxt=mul(nxt,nxt,P);
if(nxt==1&&a!=1&&a!=P-1)
return 0;
a=nxt;
}
if(a!=1)
return 0;
}
return 1;
}
inline int gcd(register int a,register int b)
{
if(!a)
return b;
if(!b)
return a;
int t=__builtin_ctzll(a|b);
a>>=__builtin_ctzll(a);
do{
b>>=__builtin_ctzll(b);
if(a>b)
a^=b^=a^=b;
b-=a;
}while(b!=0);
return a<<t;
}
inline int g(register int x,register int n)
{
int t=mul(x,x,n)+1;
return t<n?t:t-n;
}
#define M (1<<7)-1
inline int pollardrho(register int n)
{
ll x=(rand()%(n-1))+1,y=x,t=1,q=1;
for(register int k=2;;k<<=1,y=x,q=1)
{
for(register int i=1;i<=k;++i)
{
x=g(x,n);
q=mul(q,abs(x-y),n);
if(!(i&M))
{
t=gcd(q,n);
if(t>1)
break;
}
}
if(t>1||(t=gcd(q,n))>1)
break;
}
if (t==n)
{
t=1;
while(t==1)
t=gcd(abs((x=g(x, n))-y),n);
}
return t;
}
int f[N][105],np[N];
vector<int> v;
inline void find(register int x,register int id)
{
if(x==1)
return;
if(Query(x))
{
f[id][++np[id]]=x;
v.push_back(x);
return;
}
int p=x;
while(p==x)
p=pollardrho(x);
find(p,id);
find(x/p,id);
}
struct query{
int l,r,id,bl;
}q[N];
int n,m,blocksize;
inline bool cmp(register query a,register query b)
{
return a.bl!=b.bl?a.l<b.l:((a.bl&1)?a.r<b.r:a.r>b.r);
}
int ans[N],qaq[N<<1],inv[N<<1];
int num;
inline void add(register int pos)
{
for(register int i=1;i<=np[pos];++i)
num=(ll)num*inv[qaq[f[pos][i]]]%mod*(qaq[f[pos][i]]+1)%mod,++qaq[f[pos][i]];
}
inline void del(register int pos)
{
for(register int i=1;i<=np[pos];++i)
num=(ll)num*inv[qaq[f[pos][i]]]%mod*(qaq[f[pos][i]]-1)%mod,--qaq[f[pos][i]];
}
int ispri[600],pri[600],cnt=0,sum[N][100];
inline void init()
{
for(register int i=2;i<=500;++i)
ispri[i]=1;
for(register int i=2;i<=500;++i)
if(ispri[i])
{
pri[ispri[i]=++cnt]=i;
for(register int j=i<<1;j<=500;j+=i)
ispri[j]=0;
}
}
int main()
{
srand(19260817);
init();
n=read(),m=read();
blocksize=sqrt(n);
inv[1]=1;
for(register int i=2;i<=N;++i)
inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
for(register int i=1;i<=n;++i)
{
int x=read();
memcpy(sum[i],sum[i-1],sizeof(sum[i-1]));
for(register int j=1;j<=cnt&&pri[j]*pri[j]<=x;++j)
while(!(x%pri[j]))
{
++sum[i][j];
x/=pri[j];
}
if(x>1)
{
if(x<=pri[cnt])
{
++sum[i][ispri[x]];
continue;
}
find(x,i);
}
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(register int i=1;i<=n;++i)
for(register int j=1;j<=np[i];++j)
f[i][j]=lower_bound(v.begin(),v.end(),f[i][j])-v.begin();
for(register int i=1;i<=m;++i)
q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].bl=(q[i].l-1)/blocksize+1;
sort(q+1,q+1+m,cmp);
for(register int i=0;i<n<<1;++i)
qaq[i]=1;
int l=1,r=0;
num=1;
for(register int i=1;i<=m;++i)
{
while(r<q[i].r)
add(++r);
while(l>q[i].l)
add(--l);
while(r>q[i].r)
del(r--);
while(l<q[i].l)
del(l++);
ans[q[i].id]=num;
for(register int j=1;j<=cnt;++j)
ans[q[i].id]=(ll)ans[q[i].id]*(sum[r][j]-sum[l-1][j]+1)%mod;
}
for(register int i=1;i<=m;++i)
write(ans[i]),puts("");
return 0;
}

【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉的更多相关文章

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

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

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

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

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

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

  4. [Ynoi2015]此时此刻的光辉(莫队)

    一道神题...自己写出来以后被卡常了...荣获洛谷最差解... 思路还是比较好想,对于每个数 \(\sqrt{n}\) 分块,对于 \(\sqrt{n}\) 以内的数,我们可以直接求出来.对于 \(\ ...

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

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

  6. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  7. 【题解】Luogu P5072 [Ynoi2015]盼君勿忘

    众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题 我博客里对莫队的简单介绍 既然是莫队,我们就要考虑每多一个数或少一个数对答案的贡献是什么 假 ...

  8. 【题解】Luogu P5068 [Ynoi2015]我回来了

    众所周知lxl是个毒瘤,Ynoi道道都是神仙题,这道题极其良心,题面好评 原题传送门 我们先珂以在\(O(n^2)\)的时间内bfs求出任意两点距离 我们考虑如何计算从一个点到所有点的最短路长度小于等 ...

  9. 洛谷P5071 此时此刻的光辉

    2s512M. 解:先分解质因数.考虑按照质因数大小是否大于√分类. 大于的就是一个数颜色个数,莫队即可n√m. 小于的直接枚举质因数做前缀和然后O(1)查询.总时间复杂度n(√m + σ(√V)). ...

随机推荐

  1. Enterprise Craftsmanship

    转自:http://enterprisecraftsmanship.com/2015/04/13/dto-vs-value-object-vs-poco/ DTO vs Value Object vs ...

  2. JBPM工作流(三)——ProcessEngine与Service API

    1.获取processEngine的方法: a) 方法一 private ProcessEngine processEngine = new Configuration().setResource(& ...

  3. Thinkphp路由配置和静态缓存规则【原创】

    ThinkPHP框架对URL有一定的规范,所以如果你希望定制你的URL格式的话,就需要好好了解下内置的路由功能了,它能让你的URL变得更简洁和有文化. 首先我们在Common/config.php设置 ...

  4. 阿里OSS存储,php版demo

    最近项目移到云服务器,所以需要处理一下 Step 1. 初始化OSSClient SDK与OSS后台服务所有的交互都是通过OSSClient完成的.通过以下代码,可以生成OSSClient的实例: & ...

  5. Codeforces 677 - A/B/C/D/E - (Undone)

    链接: A - Vanya and Fence - [水] AC代码: #include<bits/stdc++.h> using namespace std; ; int n,h; in ...

  6. 项目实战02:nginx 反向代理负载均衡、动静分离和缓存的实现

    目录 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 2.下载编译安装tengine 3.设置代理服务器的配置文件 4.启动tengine服务 5.开启后端的web服务 6.测试 实验二:ng ...

  7. 目标检测(六)YOLOv2__YOLO9000: Better, Faster, Stronger

    项目链接 Abstract 在该论文中,作者首先介绍了对YOLOv1检测系统的各种改进措施.改进后得到的模型被称为YOLOv2,它使用了一种新颖的多尺度训练方法,使得模型可以在不同尺寸的输入上运行,并 ...

  8. Rosserial实现Windows-ROS交互操作

    安装 sudo apt-get install ros-indigo-rosserial-windows sudo apt-get install ros-indigo-rosserial-serve ...

  9. python线程、协程、I/O多路复用

    目录: 并发多线程 协程 I/O多路复用(未完成,待续) 一.并发多线程 1.线程简述: 一条流水线的执行过程是一个线程,一条流水线必须属于一个车间,一个车间的运行过程就是一个进程(一个进程内至少一个 ...

  10. eclispe集成Scalas环境后,导入外部Spark包报错:object apache is not a member of package org

    在Eclipse中集成scala环境后,发现导入的Spark包报错,提示是:object apache is not a member of package org,网上说了一大推,其实问题很简单: ...