[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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python元组_python元组的定义方式

    Python元组_python元组的定义方式元组元组的特点:是一种不可变序列,一旦创建就不能修改拆包将元组的元素取出赋值给不同变量>>>a=('hello','world',1

    2022年7月28日
    10
  • 怎么从电脑中的cmd进入mysql_在cmd中怎么进入mysql?

    怎么从电脑中的cmd进入mysql_在cmd中怎么进入mysql?在cmd中进入mysql的步骤:1、按win+r打开,输入cmd,快速打开命令行界面,然后进入cmd2、启动MySQL服务使用以下命令:netstartmyql3、进入mysql数据库输入以下命令:mysql-hlocalhost-uroot-p执行上面的命令后,会提示输入密码,输入密码后回车,当显示下面的界面时表示成功链接到了mysql数据库。3、输入”showdatabases”回…

    2022年5月7日
    67
  • MyBatis Log Plugin激活码买(注册激活)2022.02.23

    (MyBatis Log Plugin激活码买)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    88
  • C语言基础知识:函数指针&指针函数(定义格式、作用及用法说明)[通俗易懂]

    C语言基础知识:函数指针&指针函数(定义格式、作用及用法说明)[通俗易懂]版权声明:本文为博主原创文章,未经博主允许不得转载。https://mp.csdn.net/postedit/83150266一、函数指针的实质(还是指针变量)1、函数指针定义格式:类型名 (*函数名)(函数参数列表);int(*pfun)(int,int);2、函数指针的定义、赋值、调用voidfunc1(void)//定义一个函数,以方便下面定义函…

    2022年6月22日
    31
  • 眼下最好的JSP分页技术

    眼下最好的JSP分页技术

    2021年11月13日
    43
  • 不能复制文字的网页文字复制怎么办_html循环粘贴

    不能复制文字的网页文字复制怎么办_html循环粘贴网页无法复制文字怎么办?当我们在电脑上需要复制某个网页上的文字时,发现我们不能选择复制粘贴文字,那这种情况该怎么解决呢,网页无法复制文字怎么办,怎么解决网页无法复制粘贴文字情况,下面就和小编一起来看看吧!1.可以使用谷歌浏览器扩展程序AllowCopy解决问题,打开谷歌浏览器的网上应用店,搜索【AllowCopy】;2.然后找到SimpleAllowCopy,点击【添加至Chrome】将其…

    2022年10月9日
    3

发表回复

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

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