【BZOJ4869】相逢是问候(线段树,欧拉定理)
【BZOJ4869】相逢是问候(线段树,欧拉定理)
题面
题解
根据欧拉定理递归计算(类似上帝与集合的正确用法)
所以我们可以用线段树维护区间最少的被更新的多少次
如果超过了\(\varphi\)的限制
就不用再计算了
如果需要计算就每次暴力算
这样的复杂度\(O(nlog^2)\)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define lson (now<<1)
#define rson (now<<1|1)
#define MAX 80000
#define ll long long
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int a[MAX],C,P,n,m;
ll phi[MAX],tot;
ll Phi(ll x)
{
ll ret=x;
for(ll i=2;i*i<=x;++i)
if(x%i==0)
{
ret=ret/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)ret=ret/x*(x-1);
return ret;
}
ll fpow(ll a,ll b,ll P)
{
long long s=1;
bool fl=false,f2=false;
while(b)
{
if(b&1)s=1ll*s*a,fl|=f2;
if(s>=P)fl=true,s%=P;
a=a*a;
if(a>=P)f2=true,a%=P;
b>>=1;
}
if(fl)s+=P;
return s;
}
struct Node{long long sum;int tt;}t[MAX<<2];
inline void Build(int now,int l,int r)
{
if(l==r){t[now].sum=a[l]=read();return;}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
t[now].sum=(t[lson].sum+t[rson].sum)%P;
}
ll Calc(int l,int r,ll x,ll P)
{
if(l==r)return fpow(x,1,P);
return fpow(C,Calc(l+1,r,x,phi[l+1]),P);
}
void Modify(int now,int l,int r,int L,int R)
{
if(t[now].tt>=tot)return;
if(l==r)
{
t[now].sum=Calc(0,++t[now].tt,a[l],P)%P;
//t[now].sum=fpow(C,a[l],P)%P;
//a[l]=fpow(C,a[l],phi[1]);
return;
}
int mid=(l+r)>>1;
if(L<=mid)Modify(lson,l,mid,L,R);
if(R>mid)Modify(rson,mid+1,r,L,R);
t[now].tt=min(t[lson].tt,t[rson].tt);
t[now].sum=(t[lson].sum+t[rson].sum)%P;
}
int Query(int now,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return t[now].sum;
int mid=(l+r)>>1;ll ret=0;
if(L<=mid)ret=(ret+Query(lson,l,mid,L,R))%P;
if(R>mid)ret=(ret+Query(rson,mid+1,r,L,R))%P;
return ret;
}
int main()
{
n=read();m=read();P=read();C=read();
Build(1,1,n);
phi[0]=P;
for(tot=1;;++tot)
{
phi[tot]=Phi(phi[tot-1]);
if(phi[tot]==1)break;
}
phi[++tot]=1;
while(m--)
{
int opt=read(),l=read(),r=read();
if(opt)printf("%d\n",Query(1,1,n,l,r));
else Modify(1,1,n,l,r);
}
return 0;
}
【BZOJ4869】相逢是问候(线段树,欧拉定理)的更多相关文章
- 【BZOJ4869】相逢是问候 [线段树][欧拉定理]
相逢是问候 Time Limit: 40 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Informatikverbin ...
- [BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)
4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1313 Solved: 471[Submit][Stat ...
- 【bzoj4869】[Shoi2017]相逢是问候 线段树+扩展欧拉定理
Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两 ...
- BZOJ4869 [Shoi2017]相逢是问候 【扩展欧拉定理 + 线段树】
题目链接 BZOJ4869 题解 这题调得我怀疑人生,,结果就是因为某些地方\(sb\)地忘了取模 前置题目:BZOJ3884 扩展欧拉定理: \[c^a \equiv c^{a \mod \varp ...
- SHOI 2017 相逢是问候(扩展欧拉定理+线段树)
题意 https://loj.ac/problem/2142 思路 一个数如果要作为指数,那么它不能直接对模数取模,这是常识: 诸如 \(c^{c^{c^{c..}}}\) 的函数递增飞快,不是高精度 ...
- 洛谷P3747 [六省联考2017]相逢是问候
传送门 题解 扩展欧拉定理. 线段树维护,已经全改到底了的节点就不管,不然暴力修改下去. //Achen #include<algorithm> #include<iostream& ...
- bzoj 4869: [Shoi2017]相逢是问候 [扩展欧拉定理 线段树]
4869: [Shoi2017]相逢是问候 题意:一个序列,支持区间\(a_i \leftarrow c^{a_i}\),区间求和.在模p意义下. 类似于开根操作,每次取phi在log次后就不变了. ...
- BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)
由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...
- bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)
这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...
随机推荐
- mysql sql_cache缓存使用
有如下规则,如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之.这里"数据表更改"包括: INSERT, UPDATE, DELETE, TRUNCATE ...
- ElasticSearch Kibana 和Logstash 安装x-pack记录
前言 最近用到了ELK的集群,想想还是用使用官方的x-pack的monitor功能对其进行监控,这里先上图看看: 环境如下: 操作系统: window 2012 R2 ELK : elasticsea ...
- 3、flask之基于DBUtils实现数据库连接池、本地线程、上下文
本篇导航: 数据库连接池 本地线程 上下文管理 面向对象部分知识点解析 1.子类继承父类__init__的三种方式 class Dog(Animal): #子类 派生类 def __init__(se ...
- ubuntu17 安装中文输入法
在此说的是intelligent pinyin.我首先尝试的是搜狗输入法,虽然最终安装成功了,但还是直接卸载了.因为它不仅需要fcitx框架,在安装成功后,标题栏上面还会出现两个输入法图标.真正不能让 ...
- 手把手教你树莓派实现简易室内监控系统(A)
第一次写博文,有很多疏漏之处,然后受逼乎影响较深,希望大家多多包涵! _______________________________________________分割线是这样画的吧_________ ...
- yii2高级模板使用一个域名管理前后台
yii2的高级模板分为backend和frontend,最开始用yii的时候并没怎么在意,就使用了两个域名分别解析前后台.今天无意间看见 可以使用一个域名指向前后台. 1.修改 advanced/ba ...
- Git版本控制的基本命令
安装完了GIT首先要自报家门,否则代码不能提交 git config --global user.name "Your Name" git config --global user ...
- CODE大全浅谈谷歌adsense与PIN码
我的博客:CODE大全:www.codedq.net:业余草:www.xttblog.com:爱分享:www.ndislwf.com或ifxvn.com. 近期由于校园招聘笔试和面试等诸多忙碌时间,博 ...
- Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner
Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜. 配置依赖 使用 Spring Boot 2.0 首先需要将项目依赖包替换为刚刚发 ...
- hihoCoder 1493 : 歌德巴赫猜想 素数筛法
题意:哥德巴赫猜想认为"每一个大于2的偶数,都能表示成两个质数之和".给定一个大于2的偶数N,你能找到两个质数P和Q满足P<=Q并且P+Q=N吗?如果有多组解,输出P最小的一 ...