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. 云储存第三方--阿里云OSS VS 又拍云USS

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  2. iOS 友盟推送,应用内推送启动图推送闪动黑屏,插屏推送方法报错

    以前都是用的极光推送,应公司需求要求使用友盟推送,为了以后是有分享都适用,,, 友盟推送文档,下载demo 感觉比极光用着要简单顺手 一切就绪后,开始发送消息测试,,,,,搞了半天没有发过来消息 原来 ...

  3. 无 new 构造与链式调用

    无 new 构造 最简单的想法 (function(window) { var jQuery = function() { return new _jQuery(); }; var _jQuery = ...

  4. php通过system()调用Linux命令问题

    最近在做php和linux crontab的联调,发现php在linux下的权限问题需要引起注意,调试问题的过程中发现有许多问题前人说的比较零散,我在这里汇总,顺带抛砖引玉一下. 1.$result= ...

  5. nginx搭建rtmp协议流媒体服务器总结

    最近在 ubuntu12.04+wdlinux(centos)上搭建了一个rtmp服务器,感觉还挺麻烦的,所以记录下. 大部分都是参考网络上的资料. 前提: 在linux下某个目录中新建一个nginx ...

  6. vue 自定义指令directive

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

  7. 用python爬整本小说写入txt文件

    没太完善,但是可以爬下整本小说.日后会写入数据库,注释不要太在意,都是调试的.入库估计这周之后,这次爬的是笔趣阁的第1150本书,大家只要可以改get_txt()里数字就行,查到自己要看哪本书一改就可 ...

  8. Spring之Bean的基本概念

     转自http://blog.csdn.net/chenssy/article/details/8222744 Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于 ...

  9. MySQL优化一 简绍

    优化方面: 存储层:数据表”存储引擎”选取.字段类型选取.逆范式(3范式) 设计层:索引.分区/分表 架构层:分布式部署(主从模式/共享) sql语句层:结果一样的情况下,要选择效率高.速度快.节省资 ...

  10. Java实现矩阵计算器【代码】

    其实这个程序最开始是大二下学期Java的一次平时作业,当时只要求产生几个随机矩阵并对这些矩阵进行计算. 所以当时没去实现现在这么丰富而且实用的功能.不过当时倒是挺想去做的,无奈有些不知道怎么去实现. ...