[六省联考2017]相逢是问候

labview的TDMS文件读写 本文先介绍TDMS概念和文件结构,然后介绍VI如何使用,最后分析一个labview的自带范例 阅读详情

看到区间修改区间查询,大家一定会觉得这是一个线段树题
然后再看修改操作 a i = c a i a_i=c^{a_i} ai​=cai​
这玩意真的能用线段树维护吗???
答案是:显然不能
那怎么办呢?
看到这么多落在一起的幂,好多还都一样( c c c),我们可以联想到这道题所以我们可以用扩展欧拉定理推一下,顺便给自己的博客打广告嘤嘤嘤~
根据扩展欧拉定理: a c ≡ a c   m o d   ϕ ( p ) + ϕ ( p )   m o d   p a^c\equiv a^{c\bmod \phi(p)+\phi(p)}\bmod p ac≡acmodϕ(p)+ϕ(p)modp
那么经过一段时间,当 ϕ ( ϕ ( ϕ ( ϕ ( . . . ϕ ( ϕ ( p ) ) ) ) ) ) = 1 \phi(\phi(\phi(\phi(...\phi(\phi(p))))))=1 ϕ(ϕ(ϕ(ϕ(...ϕ(ϕ(p))))))=1之后,我们的式子就变成了 c c c . . . c c^{c^{c...^c}} ccc...c,就和 a i a_i ai​无关了!!!
于是我们又想到了这道题,采取一样的做法,对于修改,暴力修改如果修改到 ϕ ( ϕ ( ϕ ( ϕ ( . . . ϕ ( ϕ ( p ) ) ) ) ) ) = 1 \phi(\phi(\phi(\phi(...\phi(\phi(p))))))=1 ϕ(ϕ(ϕ(ϕ(...ϕ(ϕ(p))))))=1之后就不管他了
可以证明,最多经过 2 log ⁡ p 2\log p 2logp次之后, ϕ ( ϕ ( ϕ ( ϕ ( . . . ϕ ( ϕ ( p ) ) ) ) ) ) = 1 \phi(\phi(\phi(\phi(...\phi(\phi(p))))))=1 ϕ(ϕ(ϕ(ϕ(...ϕ(ϕ(p))))))=1,也就是说每个点最多会被修改 2 log ⁡ p 2\log p 2logp次,而每次修改最多需要 log ⁡ \log log次递归,每次递归的时候需要 log ⁡ \log log的时间来算快速幂,也就是说这道题我们就做出了一种 O ( m log ⁡ 3 p ) O(m\log^3 p) O(mlog3p)的做法
然后我们手推一下就会发现 5 × 1 0 4 × log ⁡ 3 ( 1 0 8 ) ≈ 4 × 1 0 9 5\times 10^4\times \log^3 (10^8)\approx4\times10^9 5×104×log3(108)≈4×109显然是跑不过去的,但是能够拿到 80 80 80分,但是因为这题标程出锅了,所以数据特别水,所以实际能够拿到 90 90 90。
但是注意这里有一个细节,因为扩展欧拉定理只有在指数 c ≥ ϕ ( p ) c\geq \phi(p) c≥ϕ(p)的时候才成立,所以我们要判断一下要不要加上 ϕ ( p ) \phi(p) ϕ(p),这里可以用一个flag变量来求
先贴一个 90 90 90分代码吧

#include <bits/stdc++.h>
using namespace std;

# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)

typedef long long ll;

const int N=1e5+5;

template<typename T> void read(T &x){
   x=0;int f=1;
   char c=getchar();
   for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
   for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
    x*=f;
}

# define int long long

int n,m,p,c;
int a[N];
int phi[N],dep;
bool flag;

struct segment_tree{
    int l,r;
    int sum,tim;
}seg[N<<2];

# define lc (u<<1)
# define rc (u<<1|1)

int getphi(int x){
    int res=x;
    for(int i=2;1ll*i*i<=x;i++){
        if(x%i==0)
            res=res/i*(i-1);
        while(x%i==0)x/=i;
    }
    if(x>1)res=res/x*(x-1);
    return res;
}   

void init(){
    int x=p;
    phi[0]=x;
    while(x>1){
        x=getphi(x);
        phi[++dep]=x;
    }
    phi[++dep]=1;
}

int Qpow(int base,int ind,int p){
    int res=1;
    while(ind){
        if(ind&1)res=1ll*res*base;
        base=1ll*base*base%p;
        ind>>=1;
        if(res>=p)flag=true,res%=p;
        if(base>=p)flag=true,base%=p;
    }
    return res;
}

int calc(int id,int lim,int d){
    flag=false;
    if(d==lim){
        if(a[id]>=phi[d]){
            flag=true;
            return a[id]%phi[d];
        }
        return a[id];
    }
    int x=calc(id,lim,d+1);
    if(flag)x+=phi[d+1],flag=false;
    return Qpow(c,x,phi[d]);
}

void pushup(int u){
    seg[u].sum=(seg[lc].sum+seg[rc].sum)%p;
    seg[u].tim=min(seg[lc].tim,seg[rc].tim);
}

void build(int u,int l,int r){
    seg[u].l=l,seg[u].r=r;
    if(l==r){
        seg[u].sum=a[l];
        seg[u].tim=0;
        return;
    }
    int mid=l+r>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    pushup(u);
}

void update(int u,int l,int r){
    if(seg[u].tim>=dep)return;
    if(seg[u].l==seg[u].r){
        seg[u].tim++;
        seg[u].sum=calc(seg[u].l,seg[u].tim,0);
        return;
    }
    int mid=seg[u].l+seg[u].r>>1;
    if(l<=mid)update(lc,l,r);
    if(r>mid)update(rc,l,r);
    pushup(u);
}

int query(int u,int l,int r){
    if(seg[u].l>=l&&seg[u].r<=r)return seg[u].sum;
    int mid=seg[u].l+seg[u].r>>1;
    int res=0;
    if(l<=mid)res+=query(lc,l,r);
    if(r>mid)res+=query(rc,l,r);
    res%=p;
    return res;
}

signed main()
{
    read(n),read(m),read(p),read(c);
    Rep(i,1,n)read(a[i]);
    init();
    build(1,1,n);
    Rep(i,1,m){
        int opt,x,y;
        read(opt),read(x),read(y);
        if(!opt)update(1,x,y);
        else printf("%lld\n",query(1,x,y));
    }
    return 0;
}

那么我们考虑怎么优化
我们发现我们每次暴力求答案的时候,底数是一样的,而模数也不多
所以我们可以对于每个模数进行一下光速幂(继续打广告)然后我们可以优化掉一个 log ⁡ \log log变成 O ( m log ⁡ 2 p ) O(m\log^2p) O(mlog2p)就解决了
同时我们也要在预处理的时候处理一下有没有溢出的情况(在做的过程中出现了 ≥ ϕ ( p ) \geq\phi(p) ≥ϕ(p)),如果有就加上 ϕ ( p ) \phi(p) ϕ(p)

#include <bits/stdc++.h>
using namespace std;

# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)

typedef long long ll;

const int N=1e5+5;
const int bl=10000;
const int M=65;

template<typename T> void read(T &x){
   x=0;int f=1;
   char c=getchar();
   for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
   for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
    x*=f;
}

# define int long long

int n,m,p,c;
int a[N];
int phi[N],dep;
int qpow[bl+5][M][2];
bool flag,over[bl+5][M][2];

struct segment_tree{
    int l,r;
    int sum,tim;
}seg[N<<2];

# define lc (u<<1)
# define rc (u<<1|1)

int getphi(int x){
    int res=x;
    for(int i=2;1ll*i*i<=x;i++){
        if(x%i==0)
            res=res/i*(i-1);
        while(x%i==0)x/=i;
    }
    if(x>1)res=res/x*(x-1);
    return res;
}   

void init(){
    int x=p;
    phi[0]=x;
    while(x>1){
        x=getphi(x);
        phi[++dep]=x;
    }
    phi[++dep]=1;
    Rep(i,0,dep){
        qpow[0][i][0]=1;
        Rep(j,1,bl){
            qpow[j][i][0]=qpow[j-1][i][0]*c;
            if(qpow[j][i][0]>=phi[i])over[j][i][0]=true,qpow[j][i][0]%=phi[i];
            over[j][i][0]|=over[j-1][i][0];
        }
    }
    Rep(i,0,dep){
        qpow[0][i][1]=1;
        Rep(j,1,bl){
            qpow[j][i][1]=qpow[j-1][i][1]*qpow[bl][i][0];
            if(qpow[j][i][1]>=phi[i])over[j][i][1]=true,qpow[j][i][1]%=phi[i];
            over[j][i][1]|=over[j-1][i][1];
        }
    }
}

int Qpow(int ind,int p){
    flag|=over[ind%bl][p][0]|over[ind/bl][p][1];
    int res=qpow[ind%bl][p][0]*qpow[ind/bl][p][1];
    if(res>=phi[p])flag=true,res%=phi[p];
    return res;
}

int calc(int id,int lim,int d){
    flag=false;
    if(d==lim){
        if(a[id]>=phi[d]){
            flag=true;
            return a[id]%phi[d];
        }
        return a[id];
    }
    int x=calc(id,lim,d+1);
    if(flag)x+=phi[d+1],flag=false;
    return Qpow(x,d);
}

void pushup(int u){
    seg[u].sum=(seg[lc].sum+seg[rc].sum)%p;
    seg[u].tim=min(seg[lc].tim,seg[rc].tim);
}

void build(int u,int l,int r){
    seg[u].l=l,seg[u].r=r;
    if(l==r){
        seg[u].sum=a[l];
        seg[u].tim=0;
        return;
    }
    int mid=l+r>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    pushup(u);
}

void update(int u,int l,int r){
    if(seg[u].tim>=dep)return;
    if(seg[u].l==seg[u].r){
        seg[u].tim++;
        seg[u].sum=calc(seg[u].l,seg[u].tim,0);
        return;
    }
    int mid=seg[u].l+seg[u].r>>1;
    if(l<=mid)update(lc,l,r);
    if(r>mid)update(rc,l,r);
    pushup(u);
}

int query(int u,int l,int r){
    if(seg[u].l>=l&&seg[u].r<=r)return seg[u].sum;
    int mid=seg[u].l+seg[u].r>>1;
    int res=0;
    if(l<=mid)res+=query(lc,l,r);
    if(r>mid)res+=query(rc,l,r);
    res%=p;
    return res;
}

signed main()
{
    read(n),read(m),read(p),read(c);
    Rep(i,1,n)read(a[i]);
    init();
    build(1,1,n);
    Rep(i,1,m){
        int opt,x,y;
        read(opt),read(x),read(y);
        if(!opt)update(1,x,y);
        else printf("%lld\n",query(1,x,y));
    }
    return 0;
}
小红书高时效推荐系统背后的技术升级 在小红书 APP 中,推荐系统的实效性对推荐效果有着特别重要的影响,特别是作为 UGC 平台,小红书的推荐系统如果能更快地捕捉用户与笔记之间的变化和联系,就能够给推荐带来更好的效果。在2021年上半年,首页推荐的召回、粗排、精排的主要模块都保持在天级更新的状态,我们通过持续迭代,将召回 CF 渠道、召回索引更新、召回模型/粗精排模型的训练都做到了分钟级更新,为首页推荐的分发效率带来飞跃式提升,并给业务侧带来非常显著的收益。 小红书站内“最近一天内发布的新笔记”在首页的曝光占比一直很高,这段时间更是快速 阅读详情

相关推荐

Qt+WebAssembly学习笔记(六)win10+Qt6.4.0rc1开发环境搭建

前言:因项目的缘故,笔者有段时间没测试了,官方也修复了很问题,笔者今天记录下最新版本环境搭建。

aggs1990的专栏 3765

[数学][六省联考2017]相逢是问候

Portkey T2 我发现我的问题了 题目给我的引导我总是认为它是问题 1.1 不带修 写好前缀和 1.2 每个位置只更改一次 线段树+快速幂 1.3 观察总结 样例二:一个数操作次数多了以后模的结果就不变了 这里主要针对ppp比较小的几个点,手玩ccc的几个情况 pic<---- 线段树维护即可 30pts 1.4 欧拉定理 一个很难的柿子 然后可以不写高精??? 高精题差评 弃 ...

Antimonysbguy的博客 245

【全网最全最详细】智能体提示词prompt教程

定义:提示词是用户输入给AI模型(如ChatGPT、MidJourney等)的指令或问题,用于引导模型生成特定类型的输出。它是用户与AI交互的核心媒介。作用:提示词的质量直接影响AI输出的准确性和相关性。好的提示词能明确任务边界、减少歧义,并激发模型的创造力。提示词就是“给AI下指令的说明书”——越清楚、越具体,AI干得越好!帮你更快、更准地拿到想要的结果,不用和AI“猜谜语”。

qq_38196449的博客 8214

洛谷 P3747 [六省联考2017]相逢是问候 解题报告

P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结。 \(B\) 君希望以维护一个长度为 \(n\) 的数组,这个数组的下标为从 \(1\) 到 \(n\) 的正整数。 一共有 \(m\) 个操作,可以分为两种: \(0\) \(l\) \(r\) 表示将第 \(l\) 个到第 \(r...

weixin_30916125的博客 161

4G LTE 与 5G 无线网络规划对比:从 BBU/RRU 到 CU/DU/AAU 的架构演进解析

本文深度解析4G LTE与5G无线网络架构的演进差异,从BBU/RRU分立式架构到CU/DU/AAU三级重构,揭示移动通信代际跃迁的技术本质。重点对比了网络规划中的覆盖能力、容量规划、传输网络等九大维度,为通信工程师提供实用的技术对照手册,助力5G网络高效部署。

weixin_32821533的博客 287

拆解博世、大陆的EMB方案:自增力机构如何省下83%的能耗?

本文深度解析了博世和大陆的电子机械制动(EMB)技术,重点探讨了自增力机构如何实现83%的能耗节省。通过对比电机直驱型和自增力型EMB的技术参数,揭示了自增力机构在能量优化和系统集成方面的创新优势,为汽车电动化和智能化提供了关键技术支持。

weixin_42665725的博客 391

【LuoguP3747】[六省联考2017] 相逢是问候

题目链接 题意 给定一个长度为 n 的序列 a , 给定一个正整数 c 每次修改操作是把一段区间内的数 xix_ixi​ 修改为 cxic^{x_i}cxi​ 询问区间和模 p 的结果 Sol 修改是把一个数变成 cxc^xcx , 我们很容易想到降幂公式 , 这里由于 p 不一定与 c 互质 , 那么我们就使用扩展欧拉公式 , 也就是: ax={ax&ThickSpace;&Th...

Yu Gi Oh! 252

五子棋AI算法第一篇-我对谷歌Alphago的看法

最近Google宣布他们的围棋AI以5:0的战绩打败欧洲围棋三冠王。我一直对人工智能比较感兴趣,正好趁年前空闲的几天用JS写了一个五子棋的AI。其实很久以前就用自创的算法写过一个JAVA版的五子棋AI,不过棋力很不理想。这次用的是JS写的,所以无论任何平台上只要能打开网页的都可以玩。google爆出这个新闻之后,很多人觉得这是不是意味着电脑智商已经在人类之上了,围棋已经没有意义了之类的。甚至觉得这是

言川的博客 2万+

2017六省联考 相逢是问候

题目链接:戳我 落谷时间卡得真紧。。。。test9 和test11 根本过不去,只有在BZOJ上面A掉了。。。。。。 首先可以看得出这是一个线段树维护的数据结构题目吧qwqwq 但是对于这种阶乘修改,显然是不具备可加性的,所以我们只能暴力修改。。。。但是暴力修改时间复杂度是会炸天的! 但是我们再看一下—— \(c^{a[i]^{a[i]^{...}}} \pmod p\) 我们想到了什么...

weixin_30709061的博客 129

Kimodo 入门教程(一)英伟达开源人形机器人动捕数据集训练运动学动作扩散模型

Kimodo是一个基于700小时商用光学动作捕捉数据集训练的运动学动作扩散模型,能够生成高质量的人体和机器人3D动作。该模型支持通过文本提示和多种约束条件(如关键帧、末端执行器位置等)进行控制,并提供数字人类和类人机器人两种模型变体。安装方式包括软件包安装和源代码安装两种,需要配置HuggingFace令牌以访问文本编码器。推荐使用GPU加速,最低需要17GB显存。项目提供命令行生成和交互式演示两种使用方式,演示程序支持时间轴编辑和实时3D可视化。模型分为商用友好版和受限版,其中SMPL-X版本需要额外申请

2506_90492529的博客 1925

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

努力,加油每一天鸭~ 1037

luogu P3747 [六省联考2017]相逢是问候

背景: 写一下这一周集训做的题目吧。 其实是切不动题了。 题目传送门: https://www.luogu.org/problem/P3747 题意: 一个序列,两种操作。 [1].[1].[1].将aia_iai​变为caic^{a_i}cai​; [2].[2].[2].求∑i=lraimod  p\sum_{i=l}^{r}a_i\mod p∑i=lr​ai​modp。 思路: ...

zsyz_ZZY的博客 490

如何做好软件需求分析?

软件需求分析也称为系统需求分析或需求分析工程等,是开发人员经过深入细致的调研和分析,准确理解用户和项目的功能、性能、可靠性等具体要求,将用户非形式的需求表述转化为完整的需求定义,从而确定系统必须做什么的过程。软件开发一般包括:可行性分析、需求分析、软件设计、软件开发、软件测试、软件实施、软件服务等步骤,需求分时软件开发的第一步骤。用户需求分析是指在系统设计之前和设计、开发过程中对用户需求所作的调查与分析,是系统设计、系统完善和系统维护的依据。

qq_41854911的博客 1415

P3747 [六省联考 2017] 相逢是问候

Solution 本题描述简单,思路清晰。 看见区间修改查询那肯定是线段树,但是修改的时候只能暴力单点修改。 然后注意到修改的东西是裸的欧拉降幂 之后就能写出简单的暴力了 优化 对于线段树 在操作"0"时,可以只加lazytag,不管sum和pushdown,等要询问的时候再更新线段树。 因为观察到这颗线段树只有加和查询两个操作,没有减,而且欧拉降幂中,幂次高到一定程度(可以在预处理欧拉函数时顺便得出)后,叶节点不会再变,于是在线段树节点中加入一个lock变量,来表示叶节点未来还会不会变,非叶节点在回

qq_41741401的博客 210

Statistics and Machine Learning Toolbox

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[BZOJ4869][洛谷P3747][六省联考2017]相逢是问候

Solution 建议先做这题 根据扩展欧拉定理ab%p≡ab%ϕ(p)+ϕ(p)%p,b≥ϕ(p)a^b\% p ≡ a^{b \%\phi(p)+\phi(p)}\% p_,b≥\phi(p)ab%p≡ab%ϕ(p)+ϕ(p)%p,​b≥ϕ(p)ab%p≡ab%ϕ(p)%p,b&amp;lt;ϕ(p)a^b\% p ≡ a^{b \%\phi(p)}\% p,b&amp;lt;\phi(p)...

*★,°*:.☆( ̄▽ ̄)/$:*.°★* 342

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【BZOJ 4869】【2017六省联考】相逢是问候

考虑一个欧拉定理的扩展: 当x>φ(p)x>\varphi (p)时有: cx≡cx%φ(p)+φ(p)(modp)c^x \equiv c^{x\%\varphi (p)+\varphi(p) }(mod p) 也叫作欧拉定理EXT,证明看这里:https://zhuanlan.zhihu.com/p/24902174 这个公式的强大之处在于a和p可以不互质,也就是说p可以不为质数。 然

Ripped的博客 3096

假人有限元模型

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

2017 [六省联考] T2 相逢是问候

4869: [Shoi2017]相逢是问候 Time Limit:40 SecMemory Limit:512 MBSubmit:1205Solved:409[Submit][Status][Discuss] Description Informatikverbindetdichundmich. 信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1...

weixin_30477293的博客 111

[六省联考2017]相逢是问候(线段树+拓展欧拉定理)

好题啊! 调了一个中午,发现有一条语句 \(RE\) 了。在 \(windows\) 下没关系,\(linux\) 下有问题,大大的问题。 while(phi[tot]!=1) phi[++tot]=calc_phi(phi[tot-1]); 算是拓展欧拉定理的题吧。线段树只是一个工具,最主要还是暴力修改。因为 \(\varphi\) 不断套下去最多会有 \(\lfloor \log n\rflo...

weixin_30835649的博客 168

[bzoj 4869] [六省联考2017] 相逢是问候

相逢是问候 2017-09-09 Description Informatik verbindet dich und mich. 信息将你我连结。(s:看到这个就感觉有毒 B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,...

weixin_30416871的博客 277

洛谷3747 [六省联考2017]相逢是问候

标签:线段树,欧拉定理 题目 题目传送门 题目描述 Informatik verbindet dich und mich. 信息将你我连结。 B 君希望以维护一个长度为 n 的数组,这个数组的下标为从 1 到 n 的正整数。 一共有 m 个操作,可以分为两种: 0lr表示将第l个到第r个数(al,al+1,...ar)中的每一个数ai替换为cai,即c的ai次方,其中c是输入...

Welcome to yjjr's blog! 547

[SDOI2014] 旅行

传送门 拿到这题,我:树链剖分+线段树! 哎呀C有点大。 动态开点! 不会RE吗… 其实是可能会RE的,为什么呢,我们想,最坏情况是每个点有不同的信仰,那么这个时候我们利用的空间是nlog⁡nn\log nnlogn 当nnn最坏情况下取10510^5105时,占用空间是13.2×10513.2\times10^513.2×105左右,加上修改需要两倍的空间那么应该保险起见线段树需要开27倍左右,...

NephrenRuqInsania 1366
上一篇: 光速幂
下一篇: 扩展欧几里得
NephrenRuqInsania
博客等级 码龄8年 20粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值