bzoj:4105: [Thu Summer Camp 2015]平方运算
Description
Input
第一行有三个整数N,M,p,分别代表序列的长度、平方操作与询问操作的总次数以及在平方操作中所要模的数。
Output
对于每次的询问操作,输出一行代表这段区间内数的总和。注意:答案没有对任何数取模。
Sample Input
1 2 3
1 1 3
0 1 3
1 1 3
Sample Output
14
HINT
对于100%的数据,∀i,Xi∈[0,p),l,r∈[1,n]
/**************************************************************
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]平方运算的更多相关文章
- 4105: [Thu Summer Camp 2015]平方运算
首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们 ...
- 2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)
传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标 ...
- BZOJ4105 [Thu Summer Camp 2015]平方运算 【线段树】
题目链接 BZOJ4105 题解 平方操作orz,虽说应该是线段树,但是不会维护啊QAQ 小瞧一眼题解... 平方成环?环长\(lcm\)小于\(60\)? 果然还是打表找规律题.... 那就很好做了 ...
- bzoj 4104 [Thu Summer Camp 2015]解密运算——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104 想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 . 已 ...
- bzoj4105: [Thu Summer Camp 2015]平方运算
填坑 我不知道怎么算的,但是所有环的LCM数不会超过60 然后用线段树维护这个东西,每个节点记录子树内的循环节 没到循环节的暴力枚举 复杂度是nlogn再乘以循环节长度 #include<cst ...
- 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 370 Solved: 237 De ...
- [Thu Summer Camp 2015]解密运算
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
随机推荐
- 【CSS3】布局
浮动布局: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- Linux简介,虚拟机安装,网络设置,桌面和vim安装
Linux简介: linux代表系统内核.Linux系统指基于Linux内核的操作系统,由内核和程序结合组成.比较流行的发行版本由RedHat Linux.Fedora.Centos.Debian.U ...
- [array] leetcode - 33. Search in Rotated Sorted Array - Medium
leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...
- Wincc的使用
1.组态项目步骤 1)启动Wincc 2)建立项目 3)选择及安装通信驱动程序 4)定义变量 5)建立和编辑过程画面 6)指定Wincc运行系统的属性 7)激活Wincc画面 8)使用变量模拟器测试过 ...
- input选择框样式修改与自定义
html自带的选择框样式不好看,并且在ios设备上丑的罚款.所以一般都是自定义样式: 原理:将原来默认的input选择框隐藏,然后控制label的:before与:after,配合矢量图标或者图片来实 ...
- springCloud系列教程01:Eureka 注册中心集群搭建
springCloud系列教程包含如下内容: springCloud系列教程01:Eureka 注册中心集群搭建 springCloud系列教程02:ConfigServer 配置中心server搭建 ...
- extjs Proxy
我们先来看看Extjs非常绚丽的Grid,其功能包括显示数据列表,修改.删除,分页,排序等功能. Grid组件用来显示Store中的数据.Store可以看做是Model实例的集合.Grid仅关心如 ...
- Standard PHP Library(SPL)中的数据结构
SPL提供了一组标准数据结构. SplDoublyLinkedList Class:双向链表(DLL)是在两个方向上相互链接的节点列表.当底层结构是dll时,迭代器的操作.对两端的访问.节点的添加或删 ...
- C# log4net 的配置
项目的日志组件是必备可少的,任何项目中都需要.这样既方便前期的开发测试也方便项目后期的项目维护.C#项目的一个不错的日志组件是log4net,下面我就把桌面应用程序.控制台程序.网站中log4net的 ...
- hadoop的安装和配置(一)本地模式
博主会用三篇文章来为大家详细的说明hadoop的三种模式: 本地模式 伪分布模式 完全分布模式 本地模式: 思路走向 |--------------------| | ①:配置Java环境 | | ...