众所周知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;
} 

转载于:https://www.cnblogs.com/yzhang-rp-inf/p/10121907.html

【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉相关推荐

  1. 洛谷P5071 [YNOI2015]此时此刻的光辉 莫队+玄学优化+卡常QWQ

    题目链接:传送门 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此 ...

  2. 题解 luogu P2568 GCD

    题解 luogu P2568 GCD 时间:2019.3.11 欧拉函数+前缀和 题目描述 给定整数\(N\),求\(1\le x,y \le N\)且\(\gcd(x,y)\)为素数的数对\((x, ...

  3. Luogu P5069 [Ynoi2015] 纵使日薄西山

    一开始想用线段树维护, 然后发现太多细节了,QAQ. 我们 可以发现一个数可以被取到最大值, 那么直接把他删到0不会影响结果. 因为 两边的位置都不能能取到最大值并影响当前位置. 所以我们只需要知道有 ...

  4. 洛谷P5072 [YNOI2015]盼君勿忘 莫队+unordered_set+毒瘤卡常

    在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...

  5. [Ynoi2015]即便看不到未来

    题目大意: 给定一个序列,每次询问,给出一个区间$[l,r]$. 设将区间内的元素去重后重排的数组为$p$,求$p$中长度为$1\sim 10$的极长值域连续段个数. 长度为$L$的极长值域连续段的定 ...

  6. 题解P3942_将军令

    初始数组忘了赋初值,,,我真是个机灵鬼 还有这题是三倍经验P2279&&P2016,这题的实现思想来自P2279首个题解 luogu 简化题意 给你一棵树,你有一些可以覆盖范围为$k$ ...

  7. [Ynoi2015]纵使日薄西山

    题目大意: 给定一个序列,每次单点修改,然后进行询问. 定义一次操作为,选择一个位置$x$,将这个位置的数和左边.右边两个位置的数(不存在则忽略)各减去1,然后和0取max. 对序列中最大的位置进行一 ...

  8. 新初三暑假的记录和总结

    前言 看了栋爷的这篇文章,很有感触,决定自己也要发奋一些 其中有一句话点醒了我 不要委屈自己 想说什么,就写什么 后面的文字全是自己内心的真实想法 在我的心目中栋爷一路都是辉煌的,当我看了他的博客后, ...

  9. 洛谷P3987 我永远喜欢珂朵莉~ 树状数组+vector(暴力)

    题目链接:我永远喜欢珂朵莉- 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到 ...

最新文章

  1. 从摩尔定律到人工智能,指数定律释放人类潜能
  2. 笔记本桌面计算机打开不了怎么办,笔记本电脑开不了机怎么办?
  3. 实现数据集多( 高 )维可视化(附代码)
  4. C/C++使用keybd_event模拟键盘按键
  5. Thonny开发环境中显示数据曲线
  6. python学习之路-day7
  7. 组织与科目等维度构建
  8. 【常用】加载配置文件管理资源路径
  9. esp8266手机端app_OKEX手机端APP提币教程(附视频)
  10. [深度学习]CTR模型如何加入稠密连续型|多值类别特征
  11. 致力推广 Vim 的那个程序员走了,Vim 之父:我要把 9.0 版献给他
  12. 微软的报表工具 SQL Server 2000 Reporting Services 评估版
  13. leetcode71 (2022.1.6)
  14. 比特币矿池是什么意思
  15. android alarmmanager管理,android alarmmanager需要权限吗
  16. dos攻击工具如何使用?两款dos攻击工具介绍
  17. 数据归一化和常用的归一化方法
  18. php页面添加背景图片,css怎么增加背景图片
  19. css裁剪图片 clip-path
  20. erlang与rabbitmq下载(Window)

热门文章

  1. python图纸教程_python入门教程 python入门神图一张
  2. c语言求数组中绝对值最小值,(C语言)简单的绝对值排序
  3. Node.js babel
  4. Java 项目 接口开发规范
  5. python 爬虫应用
  6. 消息中间件学习总结(4)——RocketMQ之RocketMQ 迈入50万TPS消息俱乐部
  7. Docker学习总结(38)——开发环境中使用docker run安装Redis再总结
  8. Java设计模式学习总结(12)——结构型模式之外观模式
  9. 打印中间空了一个的菱形_简单空实心图形打印|Python练习系列[3]
  10. c语言程序设计上机考试题,C语言程序设计上机考试题目汇编..doc