首页 > 其他分享 >P4139 上帝与集合的正确用法 题解

P4139 上帝与集合的正确用法 题解

时间:2024-03-09 10:56:21浏览次数:30  
标签:write phi return int 题解 isp varphi 用法 P4139

传送门

我觉得这题最有意思的其实是 "最终会固定为一个数" 这个结论。

扩展欧拉定理:\(a^b\bmod p\),当 \(b\ge \varphi(p)\) 时,\(a^b\equiv a^{b\bmod \varphi(p) + \varphi(p)}\pmod p\)。

所以 \(2^{2^{2^{\cdots}}}\) 可以递归求解。边界条件 \(p=1\)。

复杂度如何保证?其实就是算 \(p=\varphi(p)\) 会递归多少次。

发现:若 \(2\mid p\),至少减半;否则,\(2\mid \varphi(p)\)

点击查看代码
#include <bits/stdc++.h>

using namespace std;
const int N = 1e7 + 5;
typedef long long ll;

int T;
int p, phi[N];
bool isp[N] = {};
int cnt = 0, pr[N];

void init() {
    memset(isp, true, sizeof isp);
    isp[0] = isp[1] = false;
    phi[1] = 1;
    for (int i = 2; i <= N - 5; i++) {
        if (isp[i]) {
            pr[++cnt] = i;
            phi[i] = i - 1;
        }
        for (int j = 1; j <= cnt && pr[j] * i <= N - 5; j++) {
            isp[pr[j] * i] = false;
            if (i % pr[j] == 0) {
                phi[pr[j] * i] = phi[i] * pr[j];
                break;
            }
            phi[pr[j] * i] = phi[pr[j]] * phi[i];
        }
    }
}

ll fpow(ll a, ll b, ll p) {
    ll mul = 1;
    while (b) {
        if (b & 1)
            mul = mul * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return mul;
}

ll f(ll p) {
    if (p == 1)
        return 0;
    return fpow(2, f(phi[p]) + phi[p], p);
}

void write(__int128 x) {
    if (x < 0) {
        putchar('-');
        write(-x);
        return ;
    }
    if (x < 10) {
        putchar((char)(x + '0'));
        return ;
    }
    write(x / 10);
    putchar((char)(x % 10 + '0'));
    return ;
}

int main() {
    init();
	cin >> T;
	while (T--) {
        cin >> p;
//        cout << phi[p] << endl;
        cout << f(p) << endl;
	}
	return 0;
}

标签:write,phi,return,int,题解,isp,varphi,用法,P4139
From: https://www.cnblogs.com/FLY-lai/p/18062374

相关文章

  • P4774 屠龙勇士 题解
    传送门显然每一只龙对应了唯一的一把剑。用multiset可以求出每一把剑。于是题目就变成了:\[\begin{cases}b_1x\equiva_1\pmod{m_1}\\b_2x\equiva_2\pmod{m_2}\\\dots\\b_nx\equiva_n\pmod{m_n}\end{cases}\]如果\(b_i=1\),直接EXCRT即可。现在\(b_i>1\),还是以EXCRT......
  • APatch常见问题解答
    常见问题解答什么是APatch?APatch是一种类似于Magisk或KernelSU的root解决方案,但APatch提供更多功能。APatch分别结合了Magisk方便易用的通过boot.img安装的方法,和KernelSU强大的内核修补能力。APatch与Magisk的区别?Magisk对启动映像中的ramdisk进行补丁,以修改init系统。而AP......
  • cin、getline()的用法和易错事项
    一、cin>>用法1:输入一个数字或字符#include<iostream>usingnamespacestd;intmain(){inta,b;cin>>a>>b;cout<<a+b<<endl;}用法2:接收一个字符串,遇“空格”、“TAB”、“回车”就结束#include<iostream>usingnamespacestd;intmain(){c......
  • Promise用法
    如果你没有使用 async 和 await,但仍然需要处理异步操作,你可以使用 Promise 对象。Promise 对象代表了一个可能现在、将来或永远不可用的值。functionfetchDataWithPromise(){returnnewPromise((resolve,reject)=>{uni.request({url:'https:/......
  • P6810 「MCOI-02」Convex Hull 凸包 题解
    分析推式子题。\[ans=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\tau(i)\tau(j)\tau(\gcd(i,j))\]对于\((i,j)\),若\(k\)是\((i,j)\)的因子,则\(k\)一定整除\(i,j\),所以有:\[\\\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\tau(i)\tau(j)\sum\limits......
  • Rails中的includes和joins的区别与用法
    includes和joins的不同当includes和joins的时候最重要的概念就是他们有他们的典型用例。includes使用贪婪加载(eagerloading)而joins使用懒加载(lazyloading),两者都非常有用,但是也都很容易被滥用导致程序性能降低或过度使用。如果我们看一眼rubyonrails文档,描述includes最重......
  • mysql 按条件排序:order by 高级用法之case when, if 复杂排序
    转载自:https://blog.csdn.net/weixin_44684303/article/details/124445293实例1原始数据顺序需要的效果:学科按照顺序语文,数学,英语分数倒序演示创建表CREATETABLE`student_score`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键',`student_i......
  • CF1436E Complicated Computations 题解
    题目链接:CF或者洛谷关于\(mex\)问题是一个比较久远的问题,有很多经典的方法去解决。本题的\(mex\)是从正整数开始的,不要忽略掉。来讲讲常见的两种解决方案,首先回到题目所问,如果我们暴力地询问:\(1,2,3,4,.....mex\)是否都能由原数组构造出来,对于\(i\)如果它可以由原数组......
  • SQL Server触发器用法
     触发器(Trigger)是一种特殊的数据库对象,它与表相关联,并在表上的特定操作(如插入、更新、删除)发生时自动触发执行。触发器通常用于实现数据完整性约束、日志记录、审计跟踪等功能。触发器的主要特点包括:触发时机:触发器可以在数据操作之前(BeforeTrigger)或之后(AfterTrigger)执行......
  • Git 开源的版本控制系统-02-base usage 基本用法
    拓展阅读Subversion开源的版本控制系统入门介绍VCSGit开源的版本控制系统-01-入门使用介绍Git开源的版本控制系统-02-baseusage基本用法Git开源的版本控制系统-03-时间数据回溯Git开源的版本控制系统-04-branchmanage分支管理Git开源的版本控制系统-05-tags标签......