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. 【CSS3】布局

    浮动布局: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  2. Linux简介,虚拟机安装,网络设置,桌面和vim安装

    Linux简介: linux代表系统内核.Linux系统指基于Linux内核的操作系统,由内核和程序结合组成.比较流行的发行版本由RedHat Linux.Fedora.Centos.Debian.U ...

  3. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  4. Wincc的使用

    1.组态项目步骤 1)启动Wincc 2)建立项目 3)选择及安装通信驱动程序 4)定义变量 5)建立和编辑过程画面 6)指定Wincc运行系统的属性 7)激活Wincc画面 8)使用变量模拟器测试过 ...

  5. input选择框样式修改与自定义

    html自带的选择框样式不好看,并且在ios设备上丑的罚款.所以一般都是自定义样式: 原理:将原来默认的input选择框隐藏,然后控制label的:before与:after,配合矢量图标或者图片来实 ...

  6. springCloud系列教程01:Eureka 注册中心集群搭建

    springCloud系列教程包含如下内容: springCloud系列教程01:Eureka 注册中心集群搭建 springCloud系列教程02:ConfigServer 配置中心server搭建 ...

  7. extjs Proxy

    我们先来看看Extjs非常绚丽的Grid,其功能包括显示数据列表,修改.删除,分页,排序等功能.   Grid组件用来显示Store中的数据.Store可以看做是Model实例的集合.Grid仅关心如 ...

  8. Standard PHP Library(SPL)中的数据结构

    SPL提供了一组标准数据结构. SplDoublyLinkedList Class:双向链表(DLL)是在两个方向上相互链接的节点列表.当底层结构是dll时,迭代器的操作.对两端的访问.节点的添加或删 ...

  9. C# log4net 的配置

    项目的日志组件是必备可少的,任何项目中都需要.这样既方便前期的开发测试也方便项目后期的项目维护.C#项目的一个不错的日志组件是log4net,下面我就把桌面应用程序.控制台程序.网站中log4net的 ...

  10. hadoop的安装和配置(一)本地模式

    博主会用三篇文章来为大家详细的说明hadoop的三种模式: 本地模式 伪分布模式 完全分布模式 本地模式: 思路走向 |--------------------| | ①:配置Java环境  | | ...