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


相关推荐

  • deepfakes怎么用_黑科技▍如何使用 Deepfakes 给主播换脸?教程来了

    deepfakes怎么用_黑科技▍如何使用 Deepfakes 给主播换脸?教程来了下面放教程:1.获取deepfakes工具包gitclonehttps://github.com/deepfakes/faceswap.git2.补齐依赖包:pipinstalltqdmpipinstallcv2pipinstallopencv-contrib-pythonpipinstalldlibpipinstallkeraspipinstalltensorfl…

    2022年5月26日
    62
  • idea2021最新激活码【最新永久激活】

    (idea2021最新激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~Z9…

    2022年3月22日
    112
  • 服务器为什么要封海外,UDP攻击是什么「建议收藏」

    服务器为什么要封海外,UDP攻击是什么「建议收藏」为什么要封海外:总所周知,目前国内的大攻击大多都来自海外,因为国外的攻击成本比国内会低很多,一旦发起了攻击,并不容易找到攻击的源头。国外的家用带宽能达到千M口,咱们国内的百M口,相当于一只外国肉鸡能顶我们国内好几台肉鸡,那这个量是不得了的,而且国内的网站几乎很少有国外用户访问,目前封海外是国内的一大趋势。UDP攻击是什么:UDP攻击全称:UDP淹没攻击(UDPFloodAttack)。UDP淹没攻击是导致主机拒绝服务的一种攻击,属于带宽类攻击。UDP是一种无连接的协议,不需要用任何程序建立连接..

    2022年10月2日
    4
  • busybox配置telnetd

    busybox配置telnetd

    2021年11月15日
    87
  • Leetcode 差分数组的应用「建议收藏」

    Leetcode 差分数组的应用「建议收藏」题目1解法这个题目普通解法参见这里不过这里面的做法都是nlog(n)的。实际上利用差分数组,这道题目可以有O(n)做法这边简单提一下差分序列,对于一个数组,差分序列的定义是数组中前一个值和后一个值的差值形成的新数组。我们在原数组某个区间加上一个统一的值,正常的做法需要在原数组每个位置去叠加,而体现在差分数组上只需要对区间两端的值进行变化即可,差分数组的prefixsum其实就是原数组。比如原数组为:num=[1,1,1,2,2,3]差分数组为:diff_num=[1,0,0,1,0,

    2022年6月3日
    37
  • Delphi 教程

    Delphi 教程1.点击Project->View Source 可以看到工程的代码program Project1;uses  Forms,  Unit1 in ‘Unit1.pas’ {Form1};{$R *.res}begin  Application.Initialize;  Application.CreateForm(TForm1, Form1);

    2022年6月29日
    57

发表回复

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

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