填坑

我不知道怎么算的,但是所有环的LCM数不会超过60

然后用线段树维护这个东西,每个节点记录子树内的循环节

没到循环节的暴力枚举

复杂度是nlogn再乘以循环节长度

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector> #define lc (now<<1)
#define rc (now<<1|1)
#define mid (ql+qr)/2
using namespace std;
typedef long long LL;
const int _=1e2;
const int maxn=1e5+_;
const int maxp=1e4+_;
const int maxh=+;
const int mbit=(<<)+_;
int gcd(int a,int b){if(a==)return b;return gcd(b%a,a);}
int lcm(int a,int b){return a/gcd(a,b)*b;} int nxt[maxp];bool inh[maxp];int tim,v[maxp];
void init(int p)
{
for(int i=;i<p;i++)nxt[i]=i*i%p;
tim=;
for(int i=;i<p;i++)
if(v[i]==)
{
v[i]=++tim;
for(int k=nxt[i];;k=nxt[k])
{
if(v[k]==tim)
{
inh[k]=true;
for(int u=nxt[k];u!=k;u=nxt[u])inh[u]=true;
break;
}
if(v[k]>)break;
v[k]=tim;
}
}
} //--------------------------------------yu--------------------------------------------------- struct hh
{
int len,pos,h[maxh];
hh(){}
int insert(int d)
{
if(inh[d])
{
len=;pos=;h[++len]=d;
for(int k=nxt[d];k!=d;k=nxt[k])h[++len]=k;
return ;
}
return -;
}
void merge(hh h1,hh h2)
{
len=lcm(h1.len,h2.len);pos=;
for(int k=,i=h1.pos,j=h2.pos;k<=len;k++,i=i%h1.len+,j=j%h2.len+)
h[k]=h1.h[i]+h2.h[j];
}
int ad(int b){pos=(pos+b-)%len+;return h[pos];}
};
struct trnode{int sum,la;hh h;};int w[maxn];
struct Segtree
{
trnode tr[*mbit];
Segtree(){}
void update(int now)
{
tr[now].sum=tr[lc].sum+tr[rc].sum;
if(tr[lc].la!=-&&tr[rc].la!=-)
{
tr[now].la=;
tr[now].h.merge(tr[lc].h,tr[rc].h);
}
else tr[now].la=-;
}
void pushdown(int now)
{
if(tr[now].la<=)return ;
tr[lc].sum=tr[lc].h.ad(tr[now].la),tr[lc].la=(tr[lc].la+tr[now].la-)%tr[lc].h.len+;
tr[rc].sum=tr[rc].h.ad(tr[now].la),tr[rc].la=(tr[rc].la+tr[now].la-)%tr[rc].h.len+;
tr[now].la=;
}
void bt(int now,int ql,int qr)
{
if(ql==qr){tr[now].sum=w[ql],tr[now].la=tr[now].h.insert(w[ql]);return ;}
bt(lc,ql,mid),bt(rc,mid+,qr),update(now);
}
void change(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r&&tr[now].la!=-){tr[now].sum=tr[now].h.ad();tr[now].la++;return ;}
if(ql==qr){tr[now].la=tr[now].h.insert(nxt[tr[now].sum]),tr[now].sum=nxt[tr[now].sum];return ;}
pushdown(now);
if(r<=mid) change(lc,ql,mid,l,r);
else if(mid+<=l)change(rc,mid+,qr,l,r);
else change(lc,ql,mid,l,mid),change(rc,mid+,qr,mid+,r);
update(now);
}
int getsum(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r)return tr[now].sum;
pushdown(now);
if(r<=mid) return getsum(lc,ql,mid,l,r);
else if(mid+<=l)return getsum(rc,mid+,qr,l,r);
else return getsum(lc,ql,mid,l,mid)+getsum(rc,mid+,qr,mid+,r);
}
}S; //---------------------------------data structure--------------------------------------------- int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int n,Q,p;
scanf("%d%d%d",&n,&Q,&p);
init(p); for(int i=;i<=n;i++)scanf("%d",&w[i]);
S.bt(,,n); int op,x,y;
while(Q--)
{
scanf("%d%d%d",&op,&x,&y);
if(op==)S.change(,,n,x,y);
else printf("%d\n",S.getsum(,,n,x,y));
} return ;
}

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

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

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

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

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

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

    Description   Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数.   接下来一行N个数代表一开始的序列{X1,X2,... ...

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

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

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

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

  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. BZOJ4104:[Thu Summer Camp 2015]解密运算——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4104 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之 ...

  8. BZOJ4104 [Thu Summer Camp 2015]解密运算 【乱搞】

    题目链接 BZOJ4104 题解 我们将已知字符排序,由循环就可以得到一个对应关系 如样例就是: 0->第5行 1->第1行 1->第2行 1->第3行 1->第5行 2 ...

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

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

随机推荐

  1. Spoj-VISIBLEBOX Decreasing Number of Visible Box

    Shadowman loves to collect box but his roommates woogieman and itman don't like box and so shadowman ...

  2. 欧拉函数(codevs 4939)

    题目描述 Description 输入一个数n,输出小于n且与n互素的整数个数 输入描述 Input Description 包含多组数据,n=0时结束 测试数据组数不会很多,不必先打表后输出 输出描 ...

  3. 【HDOJ5978】To begin or not to begin(概率)

    题意:有k个黑球和1个红球,两个轮流抽,抽到红球算赢,问先手赢的概率大还是后手大还是相等 k<=1e5 思路:手算前几项概率 大胆猜想 #include<cstdio> #inclu ...

  4. jQuery事件委托之Safari失效的解决办法--摘抄

    什么是事件委托 事件委托是Jquery中一种事件绑定的方式,不同于常见的事件绑定方式将事件绑定在目标元素上,而是将事件绑定在父级元素上通过事件冒泡来执行绑定函数. //常见的事件绑定(Jquery) ...

  5. Oracle外键级联删除和级联更新

    https://www.2cto.com/database/201507/417496.html

  6. 《从零开始搭建游戏服务器》Eclipse和Tomcat安装配置

    我选择用来进行服务器开发的语言是Java,开发流程更接近于JavaWeb,所以需要先为开发配置一个开发环境,需要配置的主要是Eclipse和Tomcat(Web工程的容器或管理工具). 一.资源下载: ...

  7. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations

    得到k二进制后,对每一位可取得的方法进行相乘即可,k的二进制形式每一位又分为2种0,1,0时,a数组必定要为一长为n的01串,且串中不出现连续的11,1时与前述情况是相反的. 且0时其方法总数为f(n ...

  8. 升级python2至python3解决依赖关系

    1.最小化安装centos7,在升级python3的时候会出现很多包未安装,为解决依赖关系: yum -y install gcc gcc-c++ zlib zlib-devel libffi-dev ...

  9. Spring的依赖注入概述

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/dependency-injection.html: 每个基于Java应用程序都有几个对象,这些对象 ...

  10. 边看chromium的代码,边想骂人...

    这一年一直在看chromium for android的代码,边看边想骂,谷歌这帮人..一开始搞了个牛逼的架构,在安卓4.4上把以前android webkit团队的简单版替换掉了,结果发现性能大不如 ...