$bzoj4722$ 由乃 搜索
正解:搜索
解题报告:
首先发现长度为$len$的子集的值域为$[0,v\cdot len+len]$,数量为$2^{len}$.所以当$2^{len}\geq v\cdot len+len$时利用鸽巢原理发现显然是有解的.解得$len\geq 14$.
所以就只要解决$len<14$的范围内的问题了.
把转化后的题目拿出来,发现,噢这不是个折半搜索板子嘛.
复杂度也很对,$O(3^{\frac{len}{2}})$.
于是就做完了$QwQ$
嗷关于修改操作,只要每次记录下每个位置乘了多少次,然后在询问的时候如果$len<14$就$O(len)$地修改下,否则就不用管鸭$QwQ$
$over$
然后写完代码过来补点儿细节
好像也没啥,就这个修改操作我本来以为很$easy$后来发现是我想锅了$QAQ$
就修改会修改为$d^{3^k}$.所以这里有两种方法,一种是倍增一种是欧拉.因为欧拉比较好写所以我写的欧拉.就直接用扩展欧拉定理就完事$QwQ$.
但是说一个很迷惑的点,,,就我之前拿我的和倍增的方法拍了下,,,发现那个修改后的值不一样,,,但是都$AC$了,,,我也不知道咋回事$kk$
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lf double
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define lowbit(x) (x&(-x))
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=100000+10;
int n,m,mod,a[N],tr[N],ph,lim;
bool flg;
unordered_map<int,int>mp; il int read()
{
rc ch=gc;ri x=0;rb y=1;
while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
if(ch=='-')ch=gc,y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
return y?x:-x;
}
il int phi(ri x)
{
ri ret=x;
for(ri i=2;i*i<=x;i++)if(!(x%i)){ret=ret/i*(i-1);while(!(x%i))x/=i;}
if(x>1)ret=ret/x*(x-1);;return ret;
}
il int power(ri x,ri y){ri ret=1;while(y){if(y&1)ret=1ll*ret*x%mod;x=1ll*x*x%mod;y>>=1;}return ret;}
il void ad(ri nw,ri dat){while(nw<=n)tr[nw]+=dat,nw+=lowbit(nw);}
il int query(ri nw){ri ret=0;while(nw)ret+=tr[nw],nw-=lowbit(nw);return ret;}
void dfs1(ri nw,ri lim,ri sum,ri zt)
{
if(nw>lim)
{
if(!zt)return;
if(zt==1){if(mp[sum]==2 || mp[sum]==4)mp[sum]=4;else mp[sum]|=zt;return;}
if(zt==2){if(mp[sum]==1 || mp[sum]==4)mp[sum]=4;else mp[sum]|=zt;return;}
mp[sum]=3;return;
}
dfs1(nw+1,lim,sum,zt);dfs1(nw+1,lim,sum+a[nw]+1,zt|1);dfs1(nw+1,lim,sum-a[nw]-1,zt|2);
}
void dfs2(ri nw,ri lim,ri sum,ri zt)
{
if(nw>lim)
{
if(zt==1 && mp[-sum]>1){flg=1;return;}
if(zt==2 && (mp[-sum]>2 || mp[-sum]==1)){flg=1;return;}
if(mp[-sum]==3 || (zt==3 && (mp[-sum] || !sum))){flg=1;return;}
return;
}
dfs2(nw+1,lim,sum,zt);if(flg)return;
dfs2(nw+1,lim,sum+a[nw]+1,zt|1);if(flg)return;
dfs2(nw+1,lim,sum-a[nw]-1,zt|2);
}
il int lg(ri x){ri ret=0;while(x>=3)++ret,x/=3;return ret;}
il int cal(ri d){ri tmp=0;if(d>lim)tmp=ph;swap(ph,mod);d=power(3,d);swap(ph,mod);return d+tmp;} int main()
{
n=read();m=read();mod=read();ph=phi(mod);lim=lg(ph);rp(i,1,n)a[i]=read();
while(m--)
{
ri opt=read(),l=read(),r=read();
if(opt==2)ad(l,1),ad(r+1,-1);
else
{
if(r-l+1>=14){printf("Yuno\n");continue;}if(l==r){printf("Yuki\n");continue;}
rp(i,l,r){ri d=query(i);ad(i,-d);ad(i+1,d);a[i]=power(a[i],cal(d));}
flg=0;mp.clear();
dfs1(l,(l+r)>>1,0,0);dfs2(((l+r)>>1)+1,r,0,0);if(flg)printf("Yuno\n");else printf("Yuki\n");
}
}
return 0;
}
随机推荐
- HZOJ 数颜色
一眼看去树套树啊,我可能是数据结构学傻了…… 是应该去学一下莫队进阶的东西了. 上面那个东西我没有打,所以这里没有代码,而且应该也不难理解吧. 这么多平衡树就算了,不过线段树还是挺好打的. 正解3: ...
- 常用开源网站:sourceforge,github,foss,launchpad,PortableApps,datamation,opensourcewindows,opensourceMac,apache.org,kde,
常用开源网站:sourceforge,github,foss,launchpad,PortableApps,datamation,opensourcewindows,opensourceMac,apa ...
- Android图形子系统
图形操作可以有两种方式实现:一是利用通用CPU模拟图形操作:二是利用GPU专门做图形操作.前者会增加CPU的负担,在现在高分辨率已经是普遍现象的时候,让通用处理器来完成大量的图形计算已经不现实.And ...
- 学习layui框架
Layui是一款功能齐全的前端框架,需要引入对应的CSS文件和JS文件,附属官网链接:Layui官网
- SuperSocket新的配置属性 "defaultCulture"
这个新增的功能只支持 .Net framework 4.5 及其以上版本. 它允许你设置所有线程的默认Culture, 不管这些线程是如何创建,通过代码或者来自于线程池. 这个新的配置属性 " ...
- fakeroot与sudo的区别
fakeroot 可以用来模拟 root 权限,以便建立特定权限与档案拥有者的压缩文件案(tar, ar, .deb 等).透过 LD_PRELOAD 的 dynamic loader 功能,用户不必 ...
- 将 vue.js 获取的 html 文本转化为纯文本
我存入数据表中的数据是使用 html 格式,获取数据是使用 vue 获取. 遇到了一个问题,就是界面上显示的数据是 html 格式的,但是我需要它显示纯文本. 怎么做呢?首先在 js 中写一个将 ...
- SuperSocket 中内置的 Flash/Silverlight 策略服务器
关键字: 策略服务器, Flash策略服务器, Silverlight策略服务器, Policy Server, Flash Policy Server, Silverlight Policy Ser ...
- Element-ui学习笔记3--Form表单(三)
InputNumber <el-input-number v-model="num" @change="handleChange" :min=" ...
- 利用arguments求任意数量数字的和/最大值/最小值
文章地址 https://www.cnblogs.com/sandraryan/ arguments是函数内的临时数据,用完销毁,有类似于数组的操作,但不是数组. 举个栗子1:利用arguments求 ...