[CodeForces - 906D] Power Tower——扩展欧拉定理

题意

给你 $n$ 个数 $w$ 和一个数 $p$,$q$个询问,每次询问一个区间 $[l,r] $,求 $w_l^{(w_{l+1}^{(w_{l+2}…^{w_r})})}\mod 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中,次方是无限的,所以说指数一定大于 $\varphi(p)$,但是这道题中指数不一定大于 $\varphi(p)$,需要重写 Mod。

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

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

typedef long long ll;
const int maxn = 1e5 + 10;
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 = 2; i <= m; i++)
    {
        if (n % i == 0)
        {
            ans = ans / i * (i - 1);
            while (n % i == 0)  n /= i;        //除尽
        }
    }
    if (n > 1)  ans = ans / n * (n - 1);    //剩下的不为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 = 1;
    while(b)
    {
        if(b&1) ret = Mod(ret * a, p);
        a = Mod(a * a ,p);
        b >>= 1;
    }
    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 == 1)  return Mod(a[l], p);
    ll phip = get_phi(p);
    return qpow(a[l], cal(l+1, r, phip), p);  //第一类和第三类
}

int main()
{
    scanf("%I64d%I64d", &n, &p);
    for(int i = 1;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 0;
}

参考链接:

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

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

原文地址:https://www.cnblogs.com/lfri/p/11445887.html

时间: 2024-10-02 09:52:59

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

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

Priests of the Quetzalcoatl cult want to build a tower to represent a power of their god. Tower is usually made of power-charged rocks. It is built with the help of rare magic by levitating the current top of tower and adding rocks at its bottom. If

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

[题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [题解]扩展欧拉定理的形式: $$a^b\equiv a^{b\%\varphi(p)+\varphi(p)} \ \ mod \ \ p \ \ (b\leq \varphi(p))$$ 特别注意当b<φ(p)且(a,p)≠1时不变. 假如现在是三个累乘幂a^(b^c),那么根据扩展欧拉定理: $$a^

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

题目链接  Power Tower 题意  给定一个序列,每次给定$l, r$ 求$w_{l}^{w_{l+1}^{w_{l+2}^{...^{w_{r}}}}}$  对m取模的值 根据这个公式 每次递归计算. 因为欧拉函数不断迭代,下降到$1$的级别大概是$log(m)$的,那么对于每一次询问最多需要递归$log(m)$次 注意每次求解欧拉函数的时候要用map存下来,方便以后查询 #include <bits/stdc++.h> using namespace std; #define re

CodeForces 906D Power Tower &lt;&lt;欧拉降幂

题意 给定n个数,q次询问,每次输出[l,r]区间的超级幂,对m取模. 思路 超级幂问题就想到用欧拉降幂来处理 欧拉降幂公式:$a^b \% m=a^{b\%\varphi (m)+\varphi(m)}\%m,(b>\varphi(m))$ 本题用递归处理欧拉降幂,在$logm$次降幂后$\varphi(m)=1$,然后回溯时用快速幂进行计算,总的复杂度大约是$log^{2}m$ $w_0^{w_1^{w_2^{w_3^{...}}}}\% m = w_0^{[w_1^{w_2^{w_3^{.

小学扩展欧拉定理

学了一下扩展欧拉定理,不会证,记了个结论,笔记的话,随便去网上搜一搜吧.-bzoj3884:上帝与集合的正确用法无脑板子题额 #include <cstdio> #include <cstring> #include <algorithm> typedef long long LL; inline int Pow(int x,int y,int P){ int ret=1; while(y){ if(y&1)ret=(LL)ret*x%P; x=(LL)x*x%

[luogu4139]上帝与集合的正确用法【欧拉定理+扩展欧拉定理】

题目大意 让你求\(2^{2^{2^{\cdots}}}(mod)P\)的值. 前置知识 知识1:无限次幂怎么解决 让我们先来看一道全国数学竞赛的一道水题: 让你求解:\(x^{x^{x^{\cdots}}}=2\)方程的解. 对于上面的无限次幂,我们可以把这个式子移上去,得到了\(x^{2}=2\). 因为指数的原因,所以我们可以直接得到了\(x=\sqrt{2}\). 以上的问题,启示我们对于这一些无限次幂可以转移来解决. 以上的东西可能用不到 知识2:欧拉定理和扩展欧拉定理 详细请出门左拐

【CF906D】Power Tower

题目 题目链接:https://codeforces.com/problemset/problem/906/D 给出一个数列 \(a\),每次询问给出 \(l,r\),求 思路 根据扩展欧拉定理,当 \(b\geq \varphi(p)\) 时, \[a^b\equiv a^{b\bmod \varphi(p)+\varphi(p)}\pmod p \] 所以我们可以考虑递归求解,类似 这题,直到 \(l>r\) 或 \(p=1\). 由于 \(\varphi(\varphi(n))...\)

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

Description Informatik verbindet dich und mich. 信息将你我连结.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个数的和,也就是输出:sigma(ai),l<=i<=rai因为 这个结果可能会很大,所以你只需

[BZOJ 3884]上帝与集合的正确用法(扩展欧拉定理)

Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元”构成的集合.容易发现,一共有两种不同的“α”. 第三天, 上帝又创造了一个新的元素,称作“β”.“β”被定义为“α”构成的集合.容易发现,一共有四种不同的“β”. 第四天, 上帝创造了新的元素“γ”,“γ”被定义为“β”的集合.显然,一共会有16种不同的“γ”. 如果按照这样下去,上帝创造的第四种元