Description

 

Input

第一行有三个整数N,M,p,分别代表序列的长度、平方操作与询问操作的总次数以及在平方操作中所要模的数。

 
接下来一行N个数代表一开始的序列{X1,X2,...,XN}。
 
接下来M行,每行三个整数op,l,r。其中op代表本次操作的类型。若op=0,代表这是一次平方操作,平方的区间为[l,r];如果op=1,代表这是一次询问操作,询问的区间为[l,r]。
 

Output

对于每次的询问操作,输出一行代表这段区间内数的总和。注意:答案没有对任何数取模。

 

Sample Input

3 3 11
1 2 3
1 1 3
0 1 3
1 1 3

Sample Output

6
14

HINT

对于100%的数据,∀i,Xi∈[0,p),l,r∈[1,n]

N,M,p的范围如下:
 
编号  N  M  p
1  1000  1000  233
2  1000  1000  2332
3  100000  100000  5
4  100000  100000  8192
5  100000  100000  23
6  100000  100000  45
7  100000  100000  37
8  55000  55000  4185
9  55000  55000  5850
10  55000  55000  2975
11  55000  55000  2542
12  55000  55000  2015
13  60000  60000  2003
14  65000  65000  2010
15  70000  70000  4593
16  75000  75000  4562
17  80000  80000  1034
18  85000  85000  5831
19  90000  90000  9905
20  100000  100000  9977
 
膜了一大把题解
线段树是肯定的……
平方是会出现循环节的(听说会很短
预处理出所有环,和指向环的链,由于没有其他修改操作,这里面的数字肯定是越修改越往环跑,进了环就处理出跑k次后答案是多少,不在环上就暴力改……
论权限号的重要性
/**************************************************************
Problem: 4105
User: JSZX11556
Language: C++
Result: Accepted
Time:25216 ms
Memory:275236 kb
****************************************************************/ #include<cstdio>
#include<algorithm>
#define lp (p<<1)
#define rp ((p<<1)|1)
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
int n,m,p,a[],ne[],i;
bool v[],f[];
struct na{
int l,r,w,le,c,b[],pos;
bool v;
}t[];
inline int gcd(int x,int y){return y==?x:gcd(y,x%y);}
inline int lcm(int x,int y){return x*y/gcd(x,y);}
inline void updata(int p){
if (t[p].l==t[p].r) return;
t[p].w=t[lp].w+t[rp].w;
t[p].v=t[lp].v&t[rp].v;
if (t[p].v){
t[p].pos=;
t[p].le=lcm(t[lp].le,t[rp].le);
for (i=;i<t[p].le;i++) t[p].b[i]=t[lp].b[(i+t[lp].pos)%t[lp].le]+t[rp].b[(i+t[rp].pos)%t[rp].le];
}
}
inline void build(int p,int l,int r){
t[p].l=l;t[p].r=r;
if (l==r){
t[p].w=a[l];t[p].v=f[t[p].w];
if (t[p].v) for (t[p].b[]=t[p].w,t[p].le=,i=ne[t[p].w];i!=t[p].w;i=ne[i]) t[p].b[t[p].le++]=i;
return;
}
int mid=l+r>>;
build(lp,l,mid);build(rp,mid+,r);
updata(p);
}
inline void hb(int p,int c){
if (!t[p].v){
for (i=;i<=c;i++) t[p].w=ne[t[p].w];t[p].v=f[t[p].w];
if (t[p].v) for (t[p].b[]=t[p].w,t[p].le=,i=ne[t[p].w];i!=t[p].w;i=ne[i]) t[p].b[t[p].le++]=i;
return;
}
c%=t[p].le;
t[p].c+=c;if (t[p].c>=t[p].le) t[p].c-=t[p].le;
t[p].pos+=c;if (t[p].pos>=t[p].le) t[p].pos-=t[p].le;
t[p].w=t[p].b[t[p].pos];
}
inline void pd(int p){
if (t[p].c){
if (t[p].l!=t[p].r) hb(lp,t[p].c),hb(rp,t[p].c);
t[p].c=;
updata(p);
}
}
inline void ch(int p,int l,int r){
if (t[p].l==l&&t[p].r==r&&t[p].v) return hb(p,);
pd(p);
if (t[p].l==t[p].r){
t[p].w=ne[t[p].w];t[p].v=f[t[p].w];
if (t[p].v) for (t[p].b[]=t[p].w,t[p].le=,i=ne[t[p].w];i!=t[p].w;i=ne[i]) t[p].b[t[p].le++]=i;
return;
}
int mid=t[p].l+t[p].r>>;
if (r<=mid) ch(lp,l,r);else
if (l>mid) ch(rp,l,r);else
ch(lp,l,mid),ch(rp,mid+,r);
updata(p);
}
inline int MMH(int p,int l,int r){
pd(p);
if (t[p].l==l&&t[p].r==r) return t[p].w;
int mid=t[p].l+t[p].r>>;
if (r<=mid) return MMH(lp,l,r);else
if (l>mid) return MMH(rp,l,r);else
return MMH(lp,l,mid)+MMH(rp,mid+,r);
}
int main(){
register int i,j,T,l,r;
n=read();m=read();
p=read();
for (i=;i<=n;i++) a[i]=read();
for (i=;i<p;i++) ne[i]=i*i%p,f[i]=;
for (i=;i<p;i++)
if (!v[i]){
for (j=i;!v[j];j=ne[j]) v[j]=;
for (T=i;T!=j;T=ne[T]) f[T]=;
}
build(,,n);
for (i=;i<=m;i++){
T=read();l=read();r=read();
if (T)printf("%d\n",MMH(,l,r));else ch(,l,r);
}
}

bzoj:4105: [Thu Summer Camp 2015]平方运算的更多相关文章

  1. 4105: [Thu Summer Camp 2015]平方运算

    首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们 ...

  2. 2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)

    传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标 ...

  3. BZOJ4105 [Thu Summer Camp 2015]平方运算 【线段树】

    题目链接 BZOJ4105 题解 平方操作orz,虽说应该是线段树,但是不会维护啊QAQ 小瞧一眼题解... 平方成环?环长\(lcm\)小于\(60\)? 果然还是打表找规律题.... 那就很好做了 ...

  4. bzoj 4104 [Thu Summer Camp 2015]解密运算——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104 想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 . 已 ...

  5. bzoj4105: [Thu Summer Camp 2015]平方运算

    填坑 我不知道怎么算的,但是所有环的LCM数不会超过60 然后用线段树维护这个东西,每个节点记录子树内的循环节 没到循环节的暴力枚举 复杂度是nlogn再乘以循环节长度 #include<cst ...

  6. 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 De ...

  7. [Thu Summer Camp 2015]解密运算

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...

  8. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  9. BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

    开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...

随机推荐

  1. iOS 内存泄漏排查以及处理

    使用Xcode7的Instruments检测解决iOS内存泄露   文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0作为一名iOS开发攻城 ...

  2. 每周.NET前沿技术文章摘要(2017-05-17)

    汇总国外.NET社区相关文章,覆盖.NET ,ASP.NET等内容: .NET .NET Framework 4.7正式发布 链接: http://www.infoq.com/cn/news/2017 ...

  3. ArcGIS API for JavaScript 4.2学习笔记[24] 【IdentifyTask类】的使用(结合IdentifyParameters类)(第七章完结)

    好吧,我都要吐了. 接连三个例子都是类似的套路,使用某个查询参数类的实例,结合对应的Task类,对返回值进行取值.显示. 这个例子是Identify识别,使用了TileLayer这种图层,数据来自Se ...

  4. python (5分钟实现一个游戏的屏蔽敏感字系统,)

    import datetime time=datetime.datetime.now() dirty= ['fuck','狗日的','犊子','麻批','仙人板板','R你妈','操你','草你',' ...

  5. vue 自定义指令directive

    //自定义指令:directive 的传参--可以数据也可以是字符串 Vue.directive('scroll', function (binding) { window.addEventListe ...

  6. base64格式图片转换为FormData对象进行上传

    原理:理由ArrayBuffer.Blob和FormData var base64String = /*base64图片串*/; //这里对base64串进行操作,去掉url头,并转换为byte va ...

  7. 《MYSQL》----字符串的复杂函数,检索的七-天-排-重

    接到了一个新的需求,拿到需求的时候瞬间有点头大,因为实在是有些棘手. 我们这个系统本身是个接口系统,总接口数大概在200个左右.外部会有很多用户在 不同的时间拿着不同参数去调我们的这些接口,用户的调集 ...

  8. Python学习_03_列表、元组、字符串

    列表.元组.字符串这些通过顺序访问的对象统称为序列. 序列的标准操作符 对于一般的序列对象,包括列表.元组.字符串,都具有以下的标准操作: 1. element [not] in seq判断一个元素是 ...

  9. IIS Express总结

    IIS Express可以说是.NET web开发者必用的服务器,日日夜夜都和它打交道.一直以来,除了遇到什么点什么问题,很少会去关注过它. 今天看到以前转载的一篇博客,就再次温故下,主要包含IIS ...

  10. Micropython实战之TPYBoardv102 DIY金属检测仪

    转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 1.实验目的 1.学习在PC机系统中扩展简单I/O接口的方法. 2.进一 ...