BZOJ4869 [Shoi2017]相逢是问候

ADC学习(3)——采样电路 第三章 采样电路 阅读详情

传送门

题解:
看过去一眼:线段树?暴力?然后就不知道该干什么了。
看题解:woc?这公式?(好吧不会这公式就做不成题了…)

欧拉定理EXT: a b ≡ a b m o d    ϕ ( p ) + ϕ ( p ) ( m o d   p ) , b ≥ ϕ ( p ) a^b\equiv a^{b\mod \phi(p)+\phi(p)} (mod\ p),b\ge \phi(p) ab≡abmodϕ(p)+ϕ(p)(mod p),b≥ϕ(p)

在这里就别想每次对p取模之后求幂了,样例就是个不错的反例。
那么我们可以证明最多暴力修改 O ( log ⁡ p ) O(\log p) O(logp)次值就不会改变了。
还有最后求结果要求到 ϕ ( 1 ) = 1 \phi(1)=1 ϕ(1)=1,不能求到 ϕ ( 2 ) = 1 \phi(2)=1 ϕ(2)=1就算完了。
我觉得这篇讲得挺详细的qwq。
然后我们就可以用线段树存一个操作次数,操作到了 ϕ ( 1 ) = 1 \phi(1)=1 ϕ(1)=1的次数就不用维护了。前一份代码的calc确实很醚…但能过。后面代码是修了一下锅的。
由于做的时候并不敢保证卡常,所以优化了一下。
每次快速幂都要花点时间,干脆预处理好了。
参考了这位dalao的思路,预处理一下 [ 0 , 10000 ] [0,10000] [0,10000]中每一个数的每一个 ϕ \phi ϕ的次方,然后再处理这些数的10000次方,砍掉一个log。

代码:

#include<cstdio>
#include<cmath>
#define maxn 50005
#define maxm 105
int n,m,p,c,pcnt,phi[maxm],p1[maxm][maxn],p2[maxm][maxn],a[maxn];
struct node { int val,sum,lazy; } tree[maxn*4];
int powmod(int a,int n,int mod)
{
    int res=1;
    while(n)
    {
        if(n&1) res=1ll*res*a%mod;
        a=1ll*a*a%mod;
        n>>=1;
    }
    return res;
}
int Get(int x)
{
    int res=x,tmp=x;
    for(int i=2;i*i<=x;i++)
        if(tmp%i==0)
        {
            res=1ll*res*(i-1)/i;
            while(tmp%i==0) tmp/=i;
        }
    if(tmp>1) res=1ll*res*(tmp-1)/tmp;
    return res;
}
void init()
{
    phi[0]=p;
    while(phi[pcnt]>1) pcnt++,phi[pcnt]=Get(phi[pcnt-1]);
    phi[++pcnt]=1;
    for(int i=0;i<=pcnt;i++)
    {
        for(int j=0;j<=10000;j++) p1[i][j]=powmod(c,j,phi[i]);
        for(int j=0;j<=10000;j++) p2[i][j]=powmod(p1[i][10000],j,phi[i]);
    }
}
void Build(int i,int l,int r)
{
    if(l==r) { tree[i].val=0,tree[i].sum=a[l]; return; }
    int mid=(l+r)>>1;
    Build(i<<1,l,mid); Build(i<<1|1,mid+1,r);
    tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%p;
}
int Pow(int px,int n) { return 1ll*p2[px][n/10000]*p1[px][n%10000]%phi[px]; }
int calc(int x,int cnt)
{
    int res=x;
    for(int i=cnt;i>=1;i--)
    {
        if(res>=phi[i]) res=res%phi[i]+phi[i];
        res=Pow(i-1,res);
        if(!res) res=phi[i-1];
    }
    return res;
}
void Modify(int i,int l,int r,int ql,int qr)
{
    if(tree[i].lazy) return;
    if(l==r)
    {
        tree[i].sum=calc(a[l],++tree[i].val);
        if(tree[i].val==pcnt) tree[i].lazy=true;
        return;
    }
    int mid=(l+r)>>1;
    if(ql<=mid) Modify(i<<1,l,mid,ql,qr);
    if(qr>mid) Modify(i<<1|1,mid+1,r,ql,qr);
    tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%p,tree[i].lazy=tree[i<<1].lazy&tree[i<<1|1].lazy;
}
int Query(int i,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr) return tree[i].sum;
    int mid=(l+r)>>1;
    int res=0;
    if(ql<=mid) res=(res+Query(i<<1,l,mid,ql,qr))%p;
    if(qr>mid) res=(res+Query(i<<1|1,mid+1,r,ql,qr))%p;
    return res;
}
void Debug(int i,int l,int r)
{
    if(l==r) { printf("%d ",tree[i].sum); return; }
    int mid=(l+r)>>1;
    Debug(i<<1,l,mid); Debug(i<<1|1,mid+1,r);
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&p,&c);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    init();
    Build(1,1,n);
    while(m--)
    {
        int op,l,r;
        scanf("%d%d%d",&op,&l,&r);
        if(!op) Modify(1,1,n,l,r);
        else printf("%d\n",Query(1,1,n,l,r));
    }
}

Upd 2019 03 01: 修了点锅…总觉得上面代码不太严谨所以趁着老师把这道题拿出来讲的机会又搞了一遍…

#include<cstdio>
#include<cmath>
#define maxn 50005
#define maxm 105
#define N 16384
int n,m,p,c,pcnt,phi[maxm],p1[maxm][maxn],p2[maxm][maxn],a[maxn];
bool ok1[maxm][maxn],ok2[maxm][maxn];
struct node { int val,sum,lazy; } tree[maxn*4];
int powmod(int a,int n,int mod,bool &ok)
{
    int res=1,ok1=0; ok=0;
    while(n)
    {
        if(n&1) ok|=(1ll*res*a>=mod)|ok1,res=1ll*res*a%mod;
        ok1|=(1ll*a*a>=mod),a=1ll*a*a%mod;
        n>>=1;
    }
    return res;
}
int Get(int x)
{
    int res=x,tmp=x;
    for(int i=2;i*i<=x;i++)
        if(tmp%i==0)
        {
            res=1ll*res*(i-1)/i;
            while(tmp%i==0) tmp/=i;
        }
    if(tmp>1) res=1ll*res*(tmp-1)/tmp;
    return res;
}
void init()
{
    phi[0]=p;
    while(phi[pcnt]>1) pcnt++,phi[pcnt]=Get(phi[pcnt-1]);
    phi[++pcnt]=1;
    for(int i=0;i<=pcnt;i++)
    {
        for(int j=0;j<=N;j++) p1[i][j]=powmod(c,j,phi[i],ok1[i][j]);
        for(int j=0;j<=N;j++) p2[i][j]=powmod(p1[i][N],j,phi[i],ok2[i][j]);
    }
}
void Build(int i,int l,int r)
{
    if(l==r) { tree[i].val=0,tree[i].sum=a[l]; return; }
    int mid=(l+r)>>1;
    Build(i<<1,l,mid); Build(i<<1|1,mid+1,r);
    tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%p;
}
int Pow(int px,int n,bool &ok)
{ 
	ok=ok2[px][n/N]|ok1[px][n%N]|(1ll*p2[px][n/N]*p1[px][n%N]>=phi[px]);
	return 1ll*p2[px][n/N]*p1[px][n%N]%phi[px];
}
int calc(int x,int cnt)
{
	int res=x; bool ok;
	if(res>=phi[cnt]) res=res%phi[cnt]+phi[cnt];
	for(int i=cnt;i>=1;i--)
	{
		res=Pow(i-1,res,ok);
		if(ok) res+=phi[i-1];
	}
	return res%phi[0];
}
void Modify(int i,int l,int r,int ql,int qr)
{
    if(tree[i].lazy) return;
    if(l==r)
    {
        tree[i].sum=calc(a[l],++tree[i].val);
        if(tree[i].val==pcnt) tree[i].lazy=true;
        return;
    }
    int mid=(l+r)>>1;
    if(ql<=mid) Modify(i<<1,l,mid,ql,qr);
    if(qr>mid) Modify(i<<1|1,mid+1,r,ql,qr);
    tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%p,tree[i].lazy=tree[i<<1].lazy&tree[i<<1|1].lazy;
}
int Query(int i,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr) return tree[i].sum;
    int mid=(l+r)>>1;
    int res=0;
    if(ql<=mid) res=(res+Query(i<<1,l,mid,ql,qr))%p;
    if(qr>mid) res=(res+Query(i<<1|1,mid+1,r,ql,qr))%p;
    return res;
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&p,&c);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    init();
    Build(1,1,n);
    while(m--)
    {
        int op,l,r;
        scanf("%d%d%d",&op,&l,&r);
        if(!op) Modify(1,1,n,l,r);
        else printf("%d\n",Query(1,1,n,l,r));
    }
}

uniapp - 微信支付报错 {“errMsg“:“requestPayment:fail:[payment微信:-1]General errors“} 详细解决办法,uniApp使用微信支付时报错 uniapp,微信支付报错,uniapp微信小程序 H5网页 安卓苹果ios真机调试时报错,uniapp真机测试微信支付报错如何解决,调用微信支付出现报错{"errMsg":"requestPayment:fail:[payment微信:-1]General errors"},微信支付提示错误,uniapp进行微信支付时报错怎么解决,如何解决微信支付报错,uniapp微信支付报错fail,uni-app真机测试ios上报错,uniapp真机测试安卓手机第一次支付成功第二次就报错了,uniapp微信支付调用第 阅读详情

相关推荐

从入门到精通:HyperMesh实体选择全攻略(含2025新界面操作)

本文系统解析了HyperMesh从基础到高级的实体选择技巧,重点介绍了2025新界面的交互逻辑与效率提升。内容涵盖选择模式、框选方法、右键菜单高级选择、图形窗口选择器与命令面板的智能联动,以及利用浏览器和过滤器进行精准定位的实战指南,帮助用户显著提升前处理建模效率。

open4的博客 1083

创建和解析json

    void create()    {        JsonData jd = new JsonData();        jd["result"] = 1;        jd["user"] = new JsonData();//**新添加一层关系时,需要再次 new** JsonData()        jd["user"]["name"] = "zhang";        j...

joinchan的博客 1108

自学篇--使用keil5.23创建一个stm32工程并编译(固件包自带版本)

之前在本科学习阶段学习过一点51单片机的知识,可是因为基本没有实践过几次现在已经完全忘记了。。前几天老师突然丢给我几个板子说让我把程序编译、烧写环境装好,当时我就震惊了,不过经过三四天的自我摸索,之后参考他人的学习经验,现在已经基本能处理这个问题了,所以为了方便后面的学者,主要也是为了把自己这几天的学习成果记录一下,我在这里把这个过程写下来。(因为刚刚接触,很多原理性的东西都还不懂,只是一个操作步

yang_csdnForOBTS的博客 8659

TNet中JoinChannel和CreateChannel区别

TNet中JoinChannel和CreateChannel区别

海涛高软 2172

【Unity学习笔记】事件系统EventSystem

1.EventSystem物体 第一次在Unity中创建UI元素时,总会自动生成一个EventSystem物体,它包含三个组件:Transform、EventSystem、Standalone Input Module。如果我们把它删除了,会发现UI上的事件(比如点击、拖拽)将不会被检测到。没错,它就是用来处理UI相关的事件的。 1.1 EventSystem组件 EventSystem基于输入给物体发送事件,它在整个事件系统中扮演的主要角色是: 1.管理被选中的物体 2.管理正在使用的Input Modu

一白梦人的博客 1万+

保姆级教程:用Intouch SMC连接S7-200 Smart PLC,Modbus TCP和S7协议一次搞定

本文详细介绍了如何使用Intouch SMC连接S7-200 Smart PLC,涵盖Modbus TCP和S7协议的双协议通信配置。通过环境准备、参数设置、常见问题排查及实战技巧,帮助工程师快速实现工业自动化系统中的稳定通信,提升设备监控效率。

weixin_30499315的博客 432

1、Guava-连接器Joiner使用和源码分析

Guava利器之一:连接器Joiner使用和源码分析

do__something的博客 804

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1512

TNet 中 JoinChannel 场景名可写可不写

TNet 中 JoinChannel 场景名可写可不写

海涛高软 5851

Python基础语法与最佳实践【python基础篇】

本文全面介绍了Python基础语法与最佳实践,涵盖变量与数据类型、控制流、函数、模块与包等核心概念。通过实际代码示例展示了条件语句、循环结构、函数定义及模块导入的基本用法。在最佳实践部分,重点讲解了PEP 8代码风格规范、异常处理技巧、列表推导式、上下文管理器、文档字符串编写以及enumerate和zip的高效使用。这些内容既适合Python初学者掌握基础语法,也能帮助有经验的开发者编写更规范、高效、可维护的代码。文章强调遵循Python官方推荐实践,通过合理运用语言特性提升代码质量。

博客 1976

RAG 提示词工程最佳实践

虽然目前网络上关于提示工程的相关资料已经多如牛毛,然而 RAG (检索增强生成) 任务中提示工程如何进行的资料相对而言却较少。不少朋友之前也热烈的讨论过 RAG 场景下提示词的运用,因此 Zen 禅与计算机程序设计艺术 特别推出 RAG 任务下的提示词实践经验系列分享。RAG 是检索增强生成(Retrieval Augmented Generation)的简称,是当前最火热的企业级LLM应用方案。

AI天才研究院 2012

阿里云web音视频通信加入频道【aliWebrtc.joinChannel】方法错误解决

同事在搞阿里云的web音视频服务,发现怎么加入频道都不行,查看network请求,发现请求地址变为localhost开头,可是参数gslb已经赋值进去了。后面调试发现下面方法的gslb参数需要传入数组,如果传字符串虽然没有报错,但是http请求会出错。 aliWebrtc.joinChannel({ userid, // 用户ID,只能由数字、字母、下划线组成 ...

一名业余前端的博客 5153

摆脱英文束缚!群晖Transmission4.0.4全新中文界面攻略

在群晖安装完官方Transmission4.0.4套件后,界面是英文状态的,不太好用。但是按照网上分享的原来4.0以前版本的方法更新UI又失败,所以自己搞了下成功了,分享给需要的朋友。

XiaoqiangClub的博客 5213

bzoj4869 [Shoi2017]相逢是问候

http://www.elijahqi.win/2018/03/08/bzoj4869/ Description Informatikverbindetdichundmich. 信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,…,ar)中的每一个数ai替换为c^ai,即c...

Elijahqi 415

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

BZOJ4869: [Shoi2017]相逢是问候

BZOJ4869: [Shoi2017]相逢是问候 Description Informatikverbindetdichundmich. 信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是 输入的一...

weixin_30823683的博客 85

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【BZOJ4869】【SHOI2017】相逢是问候

题目大意  给定一个序列。要求满足区间取caic^{a_i}(cc为定值),区间求和(模pp意义下)。 N≤5∗104N\le 5*10^4Solution  首先看着就像线段树,这种题一般都有一个暴力不会超时的性质。   对这题来说:   首先要知道如下欧拉定理EXT:   ab≡ab mod φ(p) + φ(p)(modp),b≥φ(p)a^b\equiv a^{b\ mod\ \var

llgyc's world 2185

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

BZOJ4869 [Shoi2017]相逢是问候

题意:链接 维护一个长度为n的数组,m个操作,支持两种操作: 0 l r表示将第l个到第r个数中的每一个数ai替换为c^ai; 1 l r求第l个到第r个数的和。 思路: 首先要知道扩展欧拉定理:如果a&amp;gt;phi(p),ca≡c(amod&amp;ThinSpace;&amp;ThinSpace;phi(p))+phi(p)mod&amp;ThinSpace;&amp;ThinSpac...

G20202501的博客 294

[题解]bzoj4869 SHOI2017相逢是问候

DescriptionInformatikverbindetdichundmich. 信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,…,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是 输入的一个常数,也就是执行赋值ai=c^ai1 l r求第l个到第r个数的和

Saramanda的博客 985

bzoj 4869: [Shoi2017]相逢是问候

Description Informatikverbindetdichundmich. 信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是 输入的一个常数,也就是执行赋值ai=c^ai1 l ...

weixin_30695195的博客 136

Bzoj4869: [Shoi2017]相逢是问候

题面 传送门 Sol 摆定理 ab≡⎧⎩⎨⎪⎪ab%ϕ(p)           gcd(a,p)=1ab                  gcd(a,p)≠1,bϕ(p)ab%ϕ(p)+ϕ(p)    gcd(a,p)≠1,b≥ϕ(p)       (mod p) a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)

Cyhlnj 562

BZOJ 4869 [Shoi2017]相逢是问候 扩展欧拉定理+线段树

Description Informatikverbindetdichundmich. 信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是 输入的一个常数,也就是执行赋值ai=c^ai1 l r求第l个

I'm Growing 554

BZOJ:4869: [Shoi2017]相逢是问候

4869: [Shoi2017]相逢是问候   先说点正经的……   显然做了有限次(我只知道是有限次,而且不会大,别人说是log次?)修改以后会达到不动点,即以后怎么修改都不变了。   然后就随便做了。(3个log不知道是不是暴力啊)   但是需要拓展欧拉定理:   p与a不互质时,设c=b mod φ(p)(专门设出来是因为公式不能正常显示),如果b>=φ(p):$a^b≡ ...

weixin_30793643的博客 159

[bzoj4869][Shoi2017]相逢是问候

来自FallDream的博客,未经允许,请勿转载,谢谢。 B 君希望以维护一个长度为 n 的数组,这个数组的下标为从 1 到 n 的正整数。 一共有 m 个操作,可以分为两种: 0 l r 表示将第 l 个到第 r 个数(al al+1 ... ar)中的每一个数 ai替换为$c^{ai}$,即 c 的 ai次方,其中 c 是输入的一个常数,也就是执行赋值 $ai=c^{a...

weixin_30586257的博客 110

bzoj 4869: [Shoi2017]相逢是问候 数论+线段树

题意给出一个序列a,模数p和一个常数c,要求资瓷两个操作: 0 l r表示把l<=i<=r的a[i]变为ca[i]c^{a[i]} 1 l r表示查询a[l..r]的和。 n,m<=50000,a[i],c,p<=10^9分析首先这题要用到欧拉定理EXT:当x>=φ(p)时有cx≡cxmodφ(p)+φ(p)当x>=\varphi(p)时有c^{x}\equiv c^{x\bmod\va

beginend 715
上一篇: WC2019凉凉记
下一篇: 有上下界的网络流
dogeding
博客等级 码龄10年 31粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值