[bzoj3884] 上帝与集合的正确用法

[bzoj3884] 上帝与集合的正确用法

大家好,又见面了,我是全栈君。

题意:要你算这个玩意额:\(2^{2^{2^{…}}}\)

题解:

欧拉定理+递归

\(p=2^k*q (q为奇数)\)

题目要求\(2^{2^{2^{…}}}modp\)

变形为\(2^k(2^{2^{2^{…}}-k}modq)\) (这里需要在草稿纸上算一下)

由于q是个奇数,那么肯定与2的指数互质

原式变为\(2^k(2^{(2^{2^{…}}-k)mod\phi(q)}modq)\)

然后就可以递归求解了,当模数为1的时候,递归就结束了,然后就可以回溯计算了

递归次数不超过\(log_2p\) ,单次求\(\phi(p)\)的复杂度为\(\sqrt{p}\)

所以总复杂度为\(T*log_2p*\sqrt{p}\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

int gi() {
  int x=0,o=1; char ch=getchar();
  while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
  if(ch=='-') o=-1,ch=getchar();
  while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
  return o*x;
}

int get_phi(int x) {
  int ret=x;
  for(int i=2; i*i<=x; i++) {
    if(x%i==0) {
      ret=ret/i*(i-1);
      while(x%i==0) x/=i;
    }
  }
  if(x>1) ret=ret/x*(x-1);
  return ret;
}

int qpow(ll x, int y, int mo) {
  ll ret=1;
  while(y) {
    if(y&1) ret=ret*x%mo;
    x=x*x%mo,y>>=1;
  }
  return ret;
}

int solve(int p) {
  if(p==1) return 0;
  int k=0,phi,ret;
  while(!(p&1)) p>>=1,k++;//while(p是个偶数)
  phi=get_phi(p);
  ret=solve(phi);
  (ret+=phi-k%phi)%=phi;
  ret=qpow(2,ret,p)%p;
  return ret<<k;
}

int main() {
  int T=gi();
  while(T--) {
    int p=gi();
    printf("%d\n", solve(p));
  }
  return 0;
}

转载于:https://www.cnblogs.com/HLXZZ/p/7617318.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108127.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月7日 下午12:00
下一篇 2022年3月7日 下午1:00


相关推荐

  • 智谱上线并开源GLM-4.7

    智谱上线并开源GLM-4.7

    2026年3月12日
    2
  • 511遇见易语言教程外形框和模仿进度条闪烁效果「建议收藏」

    511遇见易语言教程外形框和模仿进度条闪烁效果「建议收藏」本节课录制了易语言的外形框,录了外形看的填充颜色、线条颜色、现行选中项,线型、线条效果,线宽、外形、并且实现了通过外形框来实现仿制进度条,及闪烁效果。视频链接:73外形框和模仿进度条闪烁效果源码:.版本2.子程序__启动窗口_创建完毕时钟1.时钟周期=10.子程序_时钟1_周期事件置随机数种子().如果真(外形框3.宽度≤400)外形框3.宽度=外形框3.宽度+取随机数(1,10).如果真结束.版本2.子程序__启

    2022年7月13日
    23
  • session、cookie、token 详解

    发展史1、很久很久以前,Web基本上就是文档的浏览而已,既然是浏览,作为服务器,不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议,就是请求加响应,尤其是我不用记住是谁刚刚发了HTTP请求,每个请求对我来说都是全新的。这段时间很嗨皮2、但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,…

    2022年4月6日
    55
  • Ubuntu 14.04 网络配置

    Ubuntu 14.04 网络配置VMware 中网络设置有三种 分别是 NAT 桥接和 Host only 本文仅说明 NAT 连接 配好后可让虚拟机上网 操作简单图文并茂 1 首先打开虚拟机的设置 2 设置成 NAT 模式 3 打开虚拟网络编辑器 4 打开权限 5 设置虚拟网络编辑器为 NAT 模式 蓝色方框中的数值不用修改 原来是多少就默认多少 然后点击确定 进行下一步 6 此就来到 Windows 界面 在右下角找到开始 图标像一个田字 右键点击会跳出运行 点击运行 或者直接快捷键 Win R 7 输入 cmd8 直接输入 ipcon

    2026年3月17日
    2
  • idea下划线怎么去除_word怎么加虚线下划线

    idea下划线怎么去除_word怎么加虚线下划线初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小伙伴在使用的时候参考。主要有:代码中大量的波浪线,参数和变量下划线,Typo提示,neverused和注释参数名不匹配提示,以及变量初始化多余时提示,形参名的提示。下面是具体操作步骤,如果按照对应的…

    2026年4月19日
    5
  • docker部署openclaw的访问方式配置

    docker部署openclaw的访问方式配置

    2026年3月13日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号