就是让你求这个:

传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5394

解题思路:

NOIP2018后第一道题,感觉非常像那个上帝与集合的正确用法。

具体来说就是使用递归的求解方式,不过这次和上帝与集合的正确用法不同的是:

1.这次不是无限项,所以可以不在p=0时停止。

2.因为被取模数有限大,所以要特判小于φ(p)的情况。

3.询问时要预先处理φ(p)

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define lll spc<<1
#define rrr spc<<1|1
#define maxval 20000000
typedef long long lnt;
struct trnt{
lnt val;
lnt lzt;
}tr[];
int prime[];
int eula[];
bool vis[];
int cnt;
int n,m;
lnt a[];
lnt read(void)
{
lnt ans=;
lnt f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch<=''&&ch>='')
{
ans=ans*10ll+(lnt)(ch-'');
ch=getchar();
}
return ans*f;
}
void Get_prime(void)
{
for(int i=;i<=maxval;i++)
{
if(!vis[i])
{
prime[++cnt]=i;
eula[i]=i-;
}
vis[i]=false;
for(int j=;j<=cnt&&(i*prime[j]<=maxval);j++)
{
vis[i*prime[j]]=true;
if(i%prime[j]==)
{
eula[i*prime[j]]=eula[i]*prime[j];
break;
}
eula[i*prime[j]]=eula[i]*(prime[j]-);
}
}
return ;
}
void Add(int spc,int l,int r,lnt v)
{
tr[spc].val+=v*(lnt)(r-l+);
tr[spc].lzt+=v;
return ;
}
void pushup(int spc)
{
tr[spc].val=tr[lll].val+tr[rrr].val;
return ;
}
void pushdown(int spc,int l,int r)
{
if(tr[spc].lzt)
{
int mid=(l+r)>>;
Add(lll,l,mid,tr[spc].lzt);
Add(rrr,mid+,r,tr[spc].lzt);
tr[spc].lzt=;
}
return ;
}
void build(int l,int r,int spc)
{
if(l==r)
{
tr[spc].val=a[l];
return ;
}
int mid=(l+r)>>;
build(l,mid,lll);
build(mid+,r,rrr);
pushup(spc);
return ;
}
void update(int l,int r,int ll,int rr,int spc,lnt v)
{
if(ll>r||l>rr)
return ;
if(ll<=l&&r<=rr)
{
Add(spc,l,r,v);
return ;
}
int mid=(l+r)>>;
pushdown(spc,l,r);
update(l,mid,ll,rr,lll,v);
update(mid+,r,ll,rr,rrr,v);
pushup(spc);
return ;
}
lnt query(int l,int r,int spc,int pos)
{
if(l==r)
return tr[spc].val;
int mid=(l+r)>>;
pushdown(spc,l,r);
if(pos<=mid)
return query(l,mid,lll,pos);
return query(mid+,r,rrr,pos);
}
lnt ksm(lnt a,lnt b,lnt mod,int plc)
{
lnt ans=;
while(b)
{
if(b&)
{
ans=ans*a;
if(ans>=mod)
{
ans%=mod;
vis[plc]=true;
}
}
a=a*a;
if(a>=mod)
{
a%=mod;
vis[plc]=true;
}
b/=;
}
return ans;
}
lnt Query(int l,int r,int p)
{
vis[l]=false;
lnt tmp=query(,n,,l);
if(tmp>=p)
vis[l]=true;
tmp%=p;
if(tmp==)
return ;
if(p==)
return ;
if(l==r)
return tmp%p;
lnt temp=eula[p];
return ksm(tmp,Query(l+,r,temp)+vis[l+]*temp,p,l);
}
int main()
{
Get_prime();
n=read();
m=read();
for(int i=;i<=n;i++)
a[i]=read();
build(,n,);
while(m--)
{
lnt cmd=read(),l=read(),r=read(),x=read();
if(cmd==)
update(,n,l,r,,x);
else
printf("%lld\n",Query(l,r,x));
}
return ;
}

BZOJ5394: [Ynoi2016]炸脖龙(欧拉广义降幂)的更多相关文章

  1. [洛谷P4118][Ynoi2016]炸脖龙I([洛谷P3934]Nephren Ruq Insania)

    题目大意:有$n$个数,每个数为$s_i$,两个操作: $1\;l\;r\;x:$表示将区间$[l,r]$内的数加上$x$ $2\;l\;r\;p:$表示求$s_l^{s_{l+1}^{^{s_{l+ ...

  2. BZOJ 5394 [Ynoi2016]炸脖龙 (线段树+拓展欧拉定理)

    题目大意:给你一个序列,需要支持区间修改,以及查询一段区间$a_{i}^{a_{i+1}^{a_{i+2}...}}mod\;p$的值,每次询问的$p$的值不同 对于区间修改,由线段树完成,没什么好说 ...

  3. P4118 [Ynoi2016]炸脖龙I

    思路:扩展欧拉定理 提交:\(\geq5\)次 错因:快速幂时刚开始没有判断\(a\)是否大于\(p\) 题解: 用树状数组维护差分,查询时暴力从左端点的第一个数向右端点递归,若递归时发现指数变为\( ...

  4. Luogu P4118 [Ynoi2016]炸脖龙I

    题目 首先考虑没有修改的情况.显然直接暴力扩展欧拉定理就行了,单次复杂度为\(O(\log p)\)的. 现在有了修改,我们可以树状数组维护差分数组,然后\(O(\log n)\)地单次查询单点值. ...

  5. Uva 10129 - Play on Words 单词接龙 欧拉道路应用

    跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...

  6. FZU 1759 欧拉函数 降幂公式

    Description   Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000 ...

  7. HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂

    装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1 ...

  8. FZU Super A^B mod C(欧拉函数降幂)

    Problem 1759 Super A^B mod C Accept: 878    Submit: 2870 Time Limit: 1000 mSec    Memory Limit : 327 ...

  9. ACM-数论-广义欧拉降幂

    https://www.cnblogs.com/31415926535x/p/11447033.html 曾今一时的懒,造就今日的泪 记得半年前去武大参加的省赛,当时的A题就是一个广义欧拉降幂的板子题 ...

随机推荐

  1. (iOS)确保设置话筒模式成功 AudioSessionSetProperty

    本人编写过一个应用,须要把实时音频播放出来,而且要从话筒播放声音,为此,作下面操作: //Step 1: 初始化 AudioSessionInitialize(NULL,NULL, NULL, sel ...

  2. Yocto tips (10): Yocto hellworld 加入一个软件包

    Yocto中一个软件包是放在bb文件里的,然后非常多的bb文件集成一个recipe(配方),然后很多的recipe又组成一个meta layer.因此,要加入一个包事实上就是在recipe以下加入一个 ...

  3. BZOJ1685: [Usaco2005 Oct]Allowance 津贴

    [传送门:BZOJ1685] 简要题意: 贝西工作勤勤恳恳,她每月向约翰索要C 元钱作为工资.约翰手上有不少钱,他一共有N 种面 额的钞票.第i 种钞票的面额记作Vi,约翰有Ki 张.钞票的面额设定是 ...

  4. 直播聊天室,点亮效果,jquery实现

    1.css #like_area img{ width: 30px; height: 30px; position: absolute; bottom: 100px; left: 60%; margi ...

  5. Spring security工作流程及集成

    A user enters their username and password into a login screen and clicks a login button. The entered ...

  6. codeforces 710C Magic Odd Square(构造或者n阶幻方)

    Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...

  7. centos中mysql 安装以及配置,建库

    1.检测系统内部有没有安装其他的mysql数据库 rpm -qa | grep mysql 然后如果有的话删除这些mysql yum remove 查出来的所有名字 2.彻底删除系统中mysql的目录 ...

  8. 安装oracle常见问题分析

    1,之前已经安装过软件,卸载不完全 /tmp/.oracle /tmp/ora* /var/tmp/ora* /etc/ora* 2,安装介质权限或者本身就有问题 3,oracle用户 $/HOME/ ...

  9. Python之路:画空心矩形

    1.if语句中当要判断多个语句成立才能执行语句时候,可以用or(或,只要其中一个成立就可以执行下一条语句)或者and(只要有其中一个不成立就不会执行下一条语句) 2.在Python中range函数会产 ...

  10. Java基础String的方法

    Java基础String的方法 字符串类型写法格式如下: 格式一: String 变量名称; 变量名称=赋值(自定义或传入的变量值); 格式二: String 变量名称=赋值(自定义或传入的变量值); ...