题意

给你 $n$ 个 $w_i$ 和一个数 $p$,$q$个询问,每次询问一个区间 $[l,r] $,求 $w_l ^{w_{l+1}^{{\vdots}^{w_r}}} \ \% p$

分析

由扩展欧拉定理:

$$a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\ a^b~~~~~~~~~~~~~~~~~~gcd(a,p)\neq1,b<\phi(p)\\ a^{b\%\phi(p)+\phi(p)}~~~~gcd(a,p)\neq1,b\geq\phi(p) \end{cases}~~~~~~~(mod~p)$$

与BZOJ 3384类似,但是在BZOJ 3384中,次方是无限的,所以说指数一定大于 $\varphi(p)$,但是这道题中指数不一定大于 $\varphi(p)$,需要重写 Mod。

phi需要记忆话,不然会超时。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = 1e5 + ;
ll n, p, a[maxn];
unordered_map<int, int>phi; ll Mod(ll x, ll mod)
{
return x < mod ? x : x % mod + mod;
} ll euler_phi(ll n)
{
ll m = (ll)sqrt(n + 0.5);
ll ans = n;
for (ll i = ; i <= m; i++)
{
if (n % i == )
{
ans = ans / i * (i - );
while (n % i == ) n /= i; //除尽
}
}
if (n > ) ans = ans / n * (n - ); //剩下的不为1,也是素数
return ans;
} ll get_phi(ll x)
{
if(phi[x]) return phi[x];
return phi[x] = euler_phi(x);
} ll qpow(ll a, ll b, ll p)
{
ll ret = ;
while(b)
{
if(b&) ret = Mod(ret * a, p);
a = Mod(a * a ,p);
b >>= ;
}
return ret;
} ll cal(ll l, ll r, ll p) //a^a^a..^a共b次
{
//printf("%lld %lld\n", t, p);
//if(t == 1) return Mod(a, p);
if(l == r) return Mod(a[l], p);
if(p == ) return Mod(a[l], p);
ll phip = get_phi(p);
return qpow(a[l], cal(l+, r, phip), p); //第一类和第三类
} int main()
{
scanf("%I64d%I64d", &n, &p);
for(int i = ;i <= n;i++) scanf("%I64d", &a[i]);
int q;
scanf("%d", &q);
while(q--)
{
ll l, r;
scanf("%I64d%I64d", &l, &r);
printf("%I64d\n", cal(l, r, p) % p); //这个取模不能少
}
return ;
}

参考链接:

1. https://blog.csdn.net/Charlie_jilei/article/details/79252689

2.https://blog.csdn.net/qq_35914587/article/details/79883547

[CodeForces - 906D] Power Tower——扩展欧拉定理的更多相关文章

  1. CodeForces 907F Power Tower(扩展欧拉定理)

    Priests of the Quetzalcoatl cult want to build a tower to represent a power of their god. Tower is u ...

  2. 【CodeForces】906 D. Power Tower 扩展欧拉定理

    [题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...

  3. CodeForces - 906D Power Tower(欧拉降幂定理)

    Power Tower CodeForces - 906D 题目大意:有N个数字,然后给你q个区间,要你求每一个区间中所有的数字从左到右依次垒起来的次方的幂对m取模之后的数字是多少. 用到一个新知识, ...

  4. [Codeforces]906D Power Tower

    虽说是一道裸题,但还是让小C学到了一点姿势的. Description 给定一个长度为n的数组w,模数m和询问次数q,每次询问给定l,r,求: 对m取模的值. Input 第一行两个整数n,m,表示数 ...

  5. Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)

    题目链接  Power Tower 题意  给定一个序列,每次给定$l, r$ 求$w_{l}^{w_{l+1}^{w_{l+2}^{...^{w_{r}}}}}$  对m取模的值 根据这个公式 每次 ...

  6. Codeforces Round #454 (Div. 1) CodeForces 906D Power Tower (欧拉降幂)

    题目链接:http://codeforces.com/contest/906/problem/D 题目大意:给定n个整数w[1],w[2],……,w[n],和一个数m,然后有q个询问,每个询问给出一个 ...

  7. Codeforces Round #454 D. Power Tower (广义欧拉降幂)

    D. Power Tower time limit per test 4.5 seconds memory limit per test 256 megabytes input standard in ...

  8. CodeForces 906D (欧拉降幂)

    Power Tower •题意 求$w_{l}^{w_{l+1}^{w_{l+2}^{w_{l+3}^{w_{l+4}^{w_{l+5}^{...^{w_{r}}}}}}}}$ 对m取模的值 •思路 ...

  9. CF906D Power Tower

    扩展欧拉定理 CF906D Power Tower 洛谷交的第二个黑题 题意 给出一个序列\(w-1,w_2,\cdots,w_n\),以及\(q\)个询问 每个询问给出\(l,r\),求: \[w_ ...

随机推荐

  1. Active Objects模式

    实现的思路是,通过代理将方法的调用转变为向阻塞队列中添加一个请求,由一个线程取出请求后执行实际的方法,然后将结果设置到Future中 这里用到了代理模式,Future模式 /************* ...

  2. pycharm django使用技巧

  3. Python中的int函数

    python帮组文档 class int(x, base=10) Return an integer object constructed from a number or string x, or ...

  4. 我在LeetCode的首次刷题

    到现在为止,我才发现我的博客一篇感受,心得,体会之言都没有. 今天就来随便扯扯. 刷题,是我最近一直在干的事情.也就每天写一两个.忘了就没写这种.也收藏了好几个刷题网站,当然第一次接触肯定是 WUST ...

  5. VC6.0- C语言-winsocket-警告warning C4761

    错误介绍 操作系统:windows10 IDE:VC6.0 语言:C语言 项目内容简介:编写一个双人网络海战棋对战游戏 警告类型:警告warning C4761 integral size misma ...

  6. 小程序的数据监听 用法和vue中的watch一样====使用通配符监听所有自数据字段的变化

    使用通配符监听所有自数据字段的变化

  7. Synchronized 与Lock的不同之处

    Synchronized 与Lock的不同之处 用法不一样.synchronized既可以加在方法上,也可以加载特定的代码块上,括号中表示需要锁的对象.而Lock需要显示地指定起始位置和终止位置.sy ...

  8. 在 WPF 程序中应用 Windows 10 真?亚克力效果

    原文:在 WPF 程序中应用 Windows 10 真?亚克力效果 从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了.不过相比于 UWP 来说, ...

  9. java之hibernate之组件映射

    1.在开发中,有的类信息比较复杂,而且某几个信息可以组成某一个部分,这个时候可以采用组件映射,组件映射是一张表映射到多个类.表结构 2.类的设计 Link.java public class Link ...

  10. NEST 根据id查询

    想要在NEST里根据id查询 GET /employee/employee/1 可使用Get方法 public IGetResponse<employee> GetDoc() { var ...