[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


相关推荐

  • hdu 4885 TIANKENG’s travel(bfs)

    hdu 4885 TIANKENG’s travel(bfs)

    2021年12月6日
    44
  • 数值分析(二续) 三次样条插值二类边界完整matlab代码

    数值分析(二续) 三次样条插值二类边界完整matlab代码目录前言 1 第一边界 2 第二边界 3 实例分析 1 第一小问 2 第二小问 4 总结前言 根据上篇文章链接 数值分析 二 三次样条插值法 matlab 程序 其中只提及到了自然边界条件情况下的 matlab 代码 本篇文章将来填补上篇文章的其他内容给出完整的三次样条插值函数 matlab 代码 注意 上篇文章所有计算原理都已讲过 本篇文章将不会重复论述上篇已有的东西 这里直接给出三种边界代码即每种边界对应一种实例题 如果还不了解原理的读者可以看上篇文章 1 第一边界代码第一边界 matlab

    2026年3月17日
    2
  • 闭包 使用场景

    闭包 使用场景一 闭包概念闭包就是能够读取其他函数内部变量的函数 或简单理解为定义在一个函数内部的函数 内部函数持有外部函数内变量的引用 二 闭包作用 1 读取函数内部的变量 2 让这些变量的值始终保持在内存中 不会再 f1 调用后被自动清除 3 方便调用上下文的局部变量 利于代码封装 原因 f1 是 f2 的父函数 f2 被赋给了一个全局变量 f2 始终存在内存中 f2 的存在依赖 f1 因此 f1 也始终存在内存中 不会在调用结束后 被垃圾回收机制回收 三 闭包缺点 1 由于闭包会使得函数中的变量都被保存在内存中 内

    2026年3月19日
    2
  • css清除浮动无效,css清除浮动的处理方法

    css清除浮动无效,css清除浮动的处理方法根据 精彩绝伦的 css JSBin news outline 1pxsolidpink col float left width 33 outline 1pxsolidblue sometext oneConHugeCo Whatdowemorp Anythingande

    2026年3月18日
    2
  • 零基础手把手教程:用gpt-oss-20b-WEBUI快速搭建本地AI对话系统

    零基础手把手教程:用gpt-oss-20b-WEBUI快速搭建本地AI对话系统

    2026年3月15日
    2
  • DEVC怎么建工程「建议收藏」

    DEVC怎么建工程「建议收藏」1.DEVC建工程1.1新建项目打开文件,选择新建项目ConsoleApplication(控制台程序),输入项目名,选择保存路径。(单独建一个文件夹存放)项目建成功后,打开项目管理,看到

    2022年8月5日
    7

发表回复

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

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