CF906D Power Tower

知识点:拓展欧拉定理、记忆化、欧拉函数、快速幂

题目链接

题意

给定序列 a i a_i ai q q q次询问 a [ l , r ] a_{[l,r]} a[l,r]的数构成以下形式对 m m m取模后的结果:
a l ( a l + 1 ( a i + 2 ( . . . a r − 1 a r ) ) ) a_l^{(a_{l+1}^{(a_{i+2}^{(...^{a_{r-1}^{a_r}})})})} al(al+1(ai+2(...ar1ar)))

思路

拓展欧拉定理:
a c ≡ a c % φ ( m ) + φ ( m ) i f   c ≥ φ ( m ) a^c\equiv a^{c\% \varphi(m)+\varphi(m)} \quad if \ c\geq \varphi(m) acac%φ(m)+φ(m)if cφ(m)
a c ≡ a c i f   c < φ ( m ) a^c\equiv a^c \quad if \ c< \varphi(m) acacif c<φ(m)
( m o d   m ) (mod \ m) (mod m)
其中 φ ( m ) \varphi(m) φ(m)为欧拉函数
令所求形式为: f ( l , r ) f(l,r) f(l,r)
递推式: f ( l , r ) = a l f ( l + 1 , r ) f(l,r)=a_l^{f(l+1,r)} f(l,r)=alf(l+1,r)
取模: f ( l , r ) % m = ( a l % m ) f ( l + 1 , r ) % φ ( m ) + φ ( m ) % m f(l,r)\%m=(a_l\%m)^{f(l+1,r)\%\varphi(m)+\varphi(m)}\%m f(l,r)%m=(al%m)f(l+1,r)%φ(m)+φ(m)%m(假定 c ≥ φ ( m ) c\geq \varphi(m) cφ(m)
观察到递推式中模数由 m m m降为 φ ( m ) \varphi(m) φ(m)、再降为 φ ( φ ( m ) ) 等 \varphi(\varphi(m))等 φ(φ(m)),证明 φ ( m ) \varphi(m) φ(m)降为 1 1 1的时间复杂度为 O ( l o g m ) O(logm) O(logm)
m m m为偶数:
m = 2 n × p i n i m=2^n\times p_i^{n_i} m=2n×pini
φ ( m ) = ( 2 − 1 ) 2 n − 1 × ( p i − 1 ) p i n i − 1 \varphi(m)=(2-1)2^{n-1}\times(p_i-1)p_i^{n_i-1} φ(m)=(21)2n1×(pi1)pini1(因子减少 2 2 2,得证)
m m m为奇数:
m = p i n i m=p_i^{n_i} m=pini p i p_i pi全为奇数)
φ ( m ) = ( p i − 1 ) p i n i − 1 \varphi(m)=(p_i-1)p_i^{n_i-1} φ(m)=(pi1)pini1(p_i-1为偶数,转换为第一种情况,得证)
φ ( m ) \varphi(m) φ(m)的复合函数预处理一下即可
(未完)

代码

#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
using namespace std;
const ll N=1e5+10;

ll n,m;
ll arr[N];
ll q;
map<ll,ll> phi;

inline ll getphi(ll x) {
   
   if(phi[x])
      return phi[x];
   ll t=x;
   ll ans=1;
   for(ll i=2; i*i<=x; i++) {
   
      if(x%i==0) {
   
         ans*=i-1;
         x/=i;
         while(x%i==0) {
   
            ans*=i;
            x/=i;
         }
      }
   }
   if(x!=1)
      ans*=x-1;
   return phi[t]=ans;
}

inline ll exeuler(ll x,ll mod) {
   
   if(x<mod)
      return x;
   return x%mod+mod;
}

inline ll pow(ll a,ll x,ll mod) {
   
   ll ans=1;
   while(x) {
   
      if(x&1)
         ans=exeuler(ans*a,mod);
      a=exeuler(a*a,mod);
      x>>=1;
   }
   return ans;
}

inline ll query(ll l,ll r,ll mod) {
   
   if(l==r)
      return exeuler(arr[l],mod);
   if(mod==1)
      return 1;
   return pow(arr[l],query(l+1,r,getphi(mod)),mod);
}

void solve() {
   
   scanf("%lld%lld",&n,&m);
   for(ll i=1; i<=n; i++)
      scanf("%lld",&arr[i]);
   scanf("%lld",&q);
   while(q--) {
   
      ll l,r;
      scanf("%lld%lld",&l,&r);
      printf("%lld\n",query(l,r,m)%m);
   }
}

int main() {
   
   solve();
   return 0;
}
全部评论

相关推荐

双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务