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. 数据分析与展示——Pandas数据特征分析

    Pandas数据特征分析 数据的排序 将一组数据通过摘要(有损地提取数据特征的过程)的方式,可以获得基本统计(含排序).分布/累计统计.数据特征(相关性.周期性等).数据挖掘(形成知识). .sort ...

  2. Linux:如何进行c++编程

    不适应美帝的饮食,当一只咸鱼在apartment里Coding一波,学习学习如何在Ubuntu实现C++的编程 正文如下: (预备知识) 学习Vim:  http://www.cnblogs.com/ ...

  3. Swift3.0 UITextField

    import UIKit private var textfieldd = UITextField() class TextFieldViewController: UIViewController, ...

  4. php面向对象4

    成员属性 基本介绍 成员属性是类的一个组成部分,一般是基本数据类型,也可以是复合类型,资源类型.比如 public $age;就是成员属性 说明 ①成员属性可以是php的任何数据类型(int, flo ...

  5. C语言位操作的算法

    1.头文件 #ifndef _INC_BITOPERATION #define _INC_BITOPERATION #endif /* 封装了所有的位操作运算 */ #include<stdio ...

  6. Linux第三节整理 、增删改查、用户管理

    帮助+基本文件管理+用户管理 1.怎么查看命令帮助 ls --help man ls :查看命令/man 5 file:查看配置文件 2.基本文件管理,通过{查,建,删,改} 四个维度介绍了不同的命令 ...

  7. Jmeter+Ant+Jenkins接口自动化测试(一)_环境部署

    前言: 2017年最后一个月份,今天抽出时间把之前的一些记录分享出来,也为今年画上个简单的句号吧,无论好与坏,无论成功与失败,简单的记忆,不要留下点点空白. 特别提示: 知识是用来分享的,但是也要尊重 ...

  8. Nginx (二) Nginx的反向代理负载均衡以及日志切割

    Nginx是一个高并发,高性能的服务器,可以进行反向代理以及网站的负载均衡.这些功能的运用都在配置文件中,也就是Nginx安装目录下的conf/nginx.conf. nginx.conf 1. 先来 ...

  9. [摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)

    ============================================================================================= 201405 ...

  10. JavaScript的DOM编程--04--获取元素节点的子节点

    获取元素节点的子节点(**只有元素节点才有子节点!!) 1). childNodes 属性获取全部的子节点, 但该方法不实用. 因为如果要获取指定的节点 的指定子节点的集合, 可以直接调用元素节点的 ...