题目大意

让你求\(2^{2^{2^{\cdots}}}(mod)P\)的值。


前置知识

知识1:无限次幂怎么解决

让我们先来看一道全国数学竞赛的一道水题:
让你求解:\(x^{x^{x^{\cdots}}}=2\)方程的解。
对于上面的无限次幂,我们可以把这个式子移上去,得到了\(x^{2}=2\)。
因为指数的原因,所以我们可以直接得到了\(x=\sqrt{2}\)。
以上的问题,启示我们对于这一些无限次幂可以转移来解决。
以上的东西可能用不到

知识2:欧拉定理和扩展欧拉定理

详细请出门左拐洛谷模板区【传送门】。(从入门到入土)
因为这一道题目\(p\)为任意整数,那么无法使用欧拉定理,那么就用比欧拉定理稍微复杂一点点的扩展欧拉定理。
简单介绍一下扩欧定理:
\[a^b\equiv a^{(b\mod\varphi(m))+\varphi(m)}\mod m\]
条件是\(b>= \varphi(m)\)
给一份蒟蒻的线性筛欧拉函数的代码

inline void Get_Phi(int MAXN) {
    phi[1] = 1;
    for (int i = 2; i <= MAXN; i ++) {
        if (!vis[i]) prime[++ Prime_tot] = i, phi[i] = i - 1;
        for (int j = 1; j <= Prime_tot && i * prime[j] <= MAXN ; j ++) {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; }
            else phi[i * prime[j]] = phi[i] * phi[prime[j]];
        }
    }
}

正解

既然我们知道了欧拉公式,那么我们就可以代到原来的幂次中,得到以下的推导:
\[2^{2^{2^{\cdots}}} \ mod \ p = 2^{2^{2^{\cdots}} mod \ \varphi(p) + \varphi(p)}\ mod \ p\]
很明显的是\(\varphi(1)=0\),那么这个就是我们递归的边界。
剩下来的幂次我们可以用快速幂实现。
欧拉函数的筛法就用线性筛就可以了,好像这一道题目就只用单个的筛好像可以更快。
时间复杂度:\(O(T+T\times log_2^p)\)


代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define db double
#define N 10000500
using namespace std;
template <typename T>
inline void read(T &x) {
    x = 0; T fl = 1; char ch = 0;
    for (; ch < '0' || ch > '9'; ch = getchar())
        if (ch == '-') fl = -1;
    for (; ch >= '0' && ch <= '9'; ch = getchar())
        x = (x << 1) + (x << 3) + (ch ^ 48);
    x *= fl;
}
template <typename T>
inline T Power(T x, T y, T Mod) {
    T res = 1;
    for (; y; y >>= 1) {if (y & 1) res = (res * x) % Mod; x = (x * x) % Mod;}
    return res % Mod;
}
ll a, b, c;
ll Prime_tot = 0;
int phi[N], prime[N];
bool vis[N];
inline void Get_Phi(int MAXN) {
    phi[1] = 1;
    for (int i = 2; i <= MAXN; i ++) {
        if (!vis[i]) prime[++ Prime_tot] = i, phi[i] = i - 1;
        for (int j = 1; j <= Prime_tot && i * prime[j] <= MAXN ; j ++) {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; }
            else phi[i * prime[j]] = phi[i] * phi[prime[j]];
        }
    }
}
ll f(ll x) {
    if (x == 1) return 0;
    else return Power(2ll, f(phi[x]) + phi[x], x);
}
int main() {
    int cas; read(cas);
    Get_Phi(1e7+1);
    while (cas --) {
        ll n; read(n);
        printf("%lld\n", f(n));
    }
    return 0;
}

[luogu4139]上帝与集合的正确用法【欧拉定理+扩展欧拉定理】的更多相关文章

  1. Luogu P4139 上帝与集合的正确用法【扩展欧拉定理】By cellur925

    题目传送门 题目中的式子很符合扩展欧拉定理的样子.(如果你还不知扩展欧拉定理,戳).对于那一堆糟心的2,我们只需要递归即可,递归边界是模数为1. 另外,本题中好像必须要用快速乘的样子...否则无法通过 ...

  2. luogu P4139 上帝与集合的正确用法(扩展欧拉定理)

    本蒟蒻现在才知带扩展欧拉定理. 对于任意的\(b\geq\varphi(p)\)有 \(a^b\equiv a^{b\ mod\ \varphi(p)+\varphi(p)}(mod\ p)\) 当\ ...

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

    Description   根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“ ...

  4. Luogu4139 上帝与集合的正确用法 拓展欧拉定理

    传送门 题意:求$2^{2^{2^{2^{...}}}} \mod p$的值.$p \leq 10^7$ 最开始想到的是$x \equiv x^2 \mod p$,然后发现不会做... 我们可以想到拓 ...

  5. 【BZOJ3884】上帝与集合的正确用法(欧拉定理,数论)

    [BZOJ3884]上帝与集合的正确用法(欧拉定理,数论) 题面 BZOJ 题解 我们有欧拉定理: 当\(b \perp p\)时 \[a^b≡a^{b\%\varphi(p)}\pmod p \] ...

  6. 洛谷P4139 上帝与集合的正确用法 [扩展欧拉定理]

    题目传送门 上帝与集合的正确用法 题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”. ...

  7. 扩展欧拉定理【洛谷P4139】 上帝与集合的正确用法

    P4139 上帝与集合的正确用法 \(2^{2^{2^{\dots}}}\bmod p\) 卡最优解倒数第一祭. 带一下扩展欧拉定理就好了. code: #include <iostream&g ...

  8. 【BZOJ3884】上帝与集合的正确用法 [欧拉定理]

    上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Input 第一行一个T ...

  9. 洛谷 P4139 上帝与集合的正确用法 解题报告

    P4139 上帝与集合的正确用法 题目描述 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新 ...

随机推荐

  1. mybatis入门配置和调试

    欢迎转载http://www.cnblogs.com/jianshuai520/p/8669177.html大家一起努力,如果看的时候有图片半边遮挡起来的话,右键查看图片,就可以观看完整的图片,具体怎 ...

  2. 6 Prefer and Would rather

    1 prefer 使用 "prefer" 用来表明通常喜欢某件事甚于另一件事.说话者喜欢打高尔夫球更甚于喜欢打网球."prefer" 的后面可以接名词(&quo ...

  3. Oracle 内存参数调优设置

    Oracle 数据库系统中起到调节作用的参数叫初始化参数,数据库管理员根据实际情况需要适当调整这些 初始化参数以优化Oracle系统. 1 主要系统参数调优介绍 2 系统内存参数的分配 2.1 Ora ...

  4. Redis 安装学习

    Linux下下载安装redis https://redis.io/download tar -zvxf redisxxx cd redisxxxx make  ---进行安装 vim ~.bash_p ...

  5. C++常用宏

    宏是由 #define 定义而来,在预处理阶段进行宏展开,它的格式是: #define N 2 + 2 // 仅仅是字符串替换 #define N (2 + 2) // 也是字符串 ,但是是(2 + ...

  6. AngularJS集合数据遍历显示

    AngularJS集合数据遍历显示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  7. Bootstrap 面板(Panels)

    一.面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .panel-default 即可,如下面的 ...

  8. 4.请介绍一下c++和Java的区别

    1.指针 2.c++多重继承,Java只能继承一个父类,但是可以继承多个接口 3.数据类型及类,Java完全面向对象,所有函数和变量都必须是类的一部分.而c++允许将函数和变量定义为全局,Java取消 ...

  9. Java开发之@PostConstruct执行顺序

    构造函数==>postConstruct==>init==destory==>predestory==卸载servlet;; 从Java EE5规范开始,Servlet增加了两个影响 ...

  10. 在delphi中生成GUID/自动获取临时表名......

    什么是 GUID ? 全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装.在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID. GUID 的格式为 ...