Ynoi竟然出了个奈芙莲的题,少见啊

Ynoi竟然有个不卡常的题,更少见了


这道题其实思路非常好想,本质上就是一个暴力,但是要用到拓展欧拉定理,是什么呢?

ac≡{ac,c<ϕ(p)acmodϕ(p)+ϕ(p),c≥ϕ(p)modpa^c\equiv\begin{cases}a^c,c<\phi(p) \\ a^{c\bmod \phi(p)+\phi(p)},c\geq\phi(p)\end{cases} \bmod pac≡{ac,c<ϕ(p)acmodϕ(p)+ϕ(p),c≥ϕ(p)​modp

这个东西有什么用呢?做过这道题的就应该很明显了

我们观察ϕ(p)\phi(p)ϕ(p)一定≤n2\leq\frac{n}{2}≤2n​,那么也就是说最多经过log⁡p\log plogp次之后,我们的ϕ(ϕ(ϕ(...ϕ(p))))=1\phi(\phi(\phi(...\phi(p))))=1ϕ(ϕ(ϕ(...ϕ(p))))=1,这个时候根据我们上面的拓展欧拉定理,我们就不需要继续算剩下的部分了,因为剩下的部分算完肯定是111

也就是说我们对于每次查询,从xxx暴力往右扫,每次都让p=ϕ(p)p=\phi(p)p=ϕ(p),那么经过一定次数之后剩下的就不用管了,然后我们再回溯更新这一部分的答案就可以

因为有区间加之类的操作,所以我们用树状数组维护差分,就可以求出每一个位置上的数是多少了

其实这题根这道题也挺像的吧,但是上帝那道题的数据比较水,我们会发现,当我们的c<ϕ(p)c<\phi(p)c<ϕ(p)的时候,我们是不能+ϕ(p)+\phi(p)+ϕ(p)的,这个东西就非常的恶心,我们需要特判一下

特判的方法也比较简单,我们在做快速幂的过程中,每次计算完先不取模,如果发现比ppp大,flag=1flag=1flag=1,然后再取模,做完快速幂之后再判断如果flag=1flag=1flag=1,那么再加上ϕ(p)\phi(p)ϕ(p)

快速幂大概是这个样子的

int Qpow(int base,int ind,int mod){int res=1;flag=false;if(base>=mod)flag=true,base%=mod;while(ind){if(ind&1){res=res*base;if(res>=mod)flag=true,res%=mod;}base=base*base;if(base>=mod)flag=true,base%=mod;ind>>=1;}return res;
}

好长啊

查询的时候其实是不用写dfsdfsdfs的,我们可以直接手动模拟栈,先把要求的部分的模数都预处理出来,然后从右往左算就可以

        else{int now=x;modn[x]=p;p=phi[p];while(p>1&&now<y){modn[++now]=p;p=phi[p];}int res=1;_Rep(i,now,x){res=Qpow(ask(i),res,modn[i]);if(flag)res+=modn[i];}printf("%lld\n",res%modn[x]);}

由于p≤2×107p\leq 2\times10^7p≤2×107,所以我们要线性筛,然后这题空间500MB,放心的开longlong吧。

其他细节没什么了,只要不像我一样线性筛出一堆锅就好


然后是这题的复杂度,我们发现,每次询问我们最多查询log⁡p\log plogp次,每次需要log⁡n\log nlogn的时间,然后算快速幂需要log⁡p\log plogp次的时间,所以这题的总复杂度应该是O(mlog⁡nlog⁡2p)O(m\log n\log^2 p)O(mlognlog2p)

毒瘤的lxl这题仁慈的开了3s时限

代码:

#include <bits/stdc++.h>
using namespace std;# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)typedef long long ll;const int N=5e5+5;
const int M=2e7+5;template<typename T> void read(T &x){x=0;int f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';x*=f;
}# define int long longint n,m;
int a[N],bit[N];
int phi[M],prime[N*10],tot;
int modn[N];
bool isp[M],flag;int lowbit(int o){return o&-o;
}void add(int o,int x){for(;o<=n;o+=lowbit(o))bit[o]+=x;
}int ask(int o){int res=0;for(;o;o-=lowbit(o))res+=bit[o];return res;
}void init()
{phi[1]=1;for(int i=2;i<=2e7;i++){if(isp[i])prime[++tot]=i,phi[i]=i-1;for(int j=1;j<=tot&&i*prime[j]<=2e7;j++){isp[i*prime[j]]=false;if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}else phi[i*prime[j]]=phi[i]*(prime[j]-1);}}
}int Qpow(int base,int ind,int mod){int res=1;flag=false;if(base>=mod)flag=true,base%=mod;while(ind){if(ind&1){res=res*base;if(res>=mod)flag=true,res%=mod;}base=base*base;if(base>=mod)flag=true,base%=mod;ind>>=1;}return res;
}signed main()
{memset(isp,true,sizeof(isp));read(n),read(m);Rep(i,1,n)read(a[i]);Rep(i,1,n)add(i,a[i]-a[i-1]);init();Rep(i,1,m){int opt,x,y,p;read(opt),read(x),read(y),read(p);if(opt==1){add(x,p);add(y+1,-p);}else{int now=x;modn[x]=p;p=phi[p];while(p>1&&now<y){modn[++now]=p;p=phi[p];}int res=1;_Rep(i,now,x){res=Qpow(ask(i),res,modn[i]);if(flag)res+=modn[i];}printf("%lld\n",res%modn[x]);}}return 0;
}

因为这题是Ynoi,所以来说点没用的

奈芙莲其实戏份挺少的,因为第四卷没有拍嘛

虽然她没有爱尔和珂朵莉的美貌

但是她达成了一件珂朵莉都没有达成的事,抱着威廉睡觉

而且,她是不是也算是在最后一刻绽放呢?

她难道不也是最幸福的女孩子吗?

[Ynoi2016]炸脖龙I/Nephren Ruq Insania相关推荐

  1. BZOJ 5394 [Ynoi2016]炸脖龙 (线段树+拓展欧拉定理)

    题目大意:给你一个序列,需要支持区间修改,以及查询一段区间$a_{i}^{a_{i+1}^{a_{i+2}...}}mod\;p$的值,每次询问的$p$的值不同 对于区间修改,由线段树完成,没什么好说 ...

  2. noip模拟赛 Nephren Ruq Insania

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 注意:本题大样例4的输出文件修改为 https://pan.baidu.com/s/1b ...

  3. P3934-Nephren Ruq Insania【欧拉定理,树状数组】

    正题 题目链接:https://www.luogu.org/problemnew/show/P3934 题目大意 长度为nnn的序列aaa 1lrw:1\ l\ r\ w:1 l r w:让l∼rl\ ...

  4. 2018十二月刷题列表

    Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...

  5. 【权游相关】龙的简史 | 混乱博物馆

    世界上有讲不完的龙的故事,在欧洲,巨龙总是与骑士和公主联系起来.他们遥远地根植于古希腊和北欧的神话中,然而巨龙成为今天这幅双翼避日.口吐烈火的冷血形象,却是很晚近的事情. 本期混乱博物馆将带给你欧洲巨 ...

  6. 【学习笔记】线段树详解(全)

    [学习笔记]线段树详解(全) 和三个同学一起搞了接近两个月的线段树,头都要炸了T_T,趁心态尚未凉之前赶快把东西记下来... [目录] [基础]作者:\((Silent\)_\(EAG)\) [懒标记 ...

  7. 2019纪中暑假游记+总结

    Travels总篇\texttt{Travels总篇}Travels总篇 7/4\texttt{7/4}7/4 下午才去纪中,早上就一大早和同学出去玩,看了蜘蛛侠然后到3点多才出发. 因为走南沙大桥所 ...

  8. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下. Noip2007 树网的核:floyd,推出性质,暴力. Noip2008 笨小猴:模拟 Noip2008 火柴棒等式:枚举 Noip2008 传纸条:棋盘dp ...

  9. 11粘土人脖卡面撑怎么用_纽约春节必备小吃!鸭脖、炸串、麻辣烫...送到家门口,放肆撸爽!...

    人生就像啃鸭脖,既要有大块吃肉的快感,也要啃骨唆髓的销魂!坐落在法拉盛的喵喵鸭,主营各类卤味.鸭货鸡爪猪耳朵,牛腱藕片猪蹄子一应具全.最值得一提的就是鸭脖了.味道鲜美无比,香.辣.甘.麻.甜.酥,啃光 ...

  10. 王炸不断,半导体巨头们到底在打什么牌?

    作者 | 马超  责编 | 欧阳姝黎 出品 | CSDN博客 头图 | 下载于视觉中国 最近整个半导体行业实在风起云涌,IBM 推出了 2nm 的芯片,苹果春季发布会上搭载 M1 的 iPad Pro ...

最新文章

  1. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
  2. Ajax Toolkit日历控件CalendarExtender求教!
  3. Scrum Meeting---Four(2015-10-28)
  4. c++读取.dat文件_MySQL 数据文件类型
  5. 中控ecs700 mysql_浙大中控ECS700工程指导手册.pdf
  6. 翻转单词顺序列C语言,剑指offer刷题之c、c++实现的翻转单词顺序列
  7. 无线接口配置 DHCP配置
  8. asp网络编程:用ASP构建音乐服务器的方法
  9. CSS3自定义下拉框菜单
  10. python分秒换算_度换算成度分秒的Python操作方法
  11. 如何在Mac上裁剪图片,教你几个技巧
  12. 美国车联网(V2X)发展现状与反思
  13. 连接防火墙/路由器的几种方式
  14. ubuntu系统备份、系统镜像制作教程
  15. MIPI入门——D-PHY介绍(一)
  16. 网页小图标和文字混排时如何对齐基准线
  17. python统计分析方法
  18. 男人典范-《万历十五年》的启示
  19. debian安装MySQL
  20. 冥冥之中——姥姥的喜丧

热门文章

  1. 供应链金融三种模式介绍及对比
  2. mac电脑如何查看cpu占用率?以及如何修复Mac的“ kernel_task” CPU使用率过高的Bug
  3. 业余10—解决只能打开网页不能打开QQ或视频软件问题
  4. 关于tomcat项目中poi报错出现的问题
  5. 提高iOS开发效率的第三方框架(更新中)
  6. 微信小程序样式Flex Box精通课程-Flex容器的属性-justify-content内容对齐(左中右)
  7. 对ratings_data和trust_data进行分析
  8. 计算机磁盘图标显示异常,Win7磁盘图标显示错误是怎么回事?修复分区磁盘图标异常教程...
  9. 163邮箱的登陆页面是什么样的有几种登陆方式?163邮箱手机版登陆
  10. 华为认证: 高级redhat例题及答案