zoukankan      html  css  js  c++  java
  • BZOJ 3884 上帝与集合的正确用法[欧拉降幂]

    Description

    根据一些书上的记载,上帝的一次失败的创世经历是这样的:
    第一天, 上帝创造了一个世界的基本元素,称做“元”。
    第二天, 上帝创造了一个新的元素,称作“α”。“α”被定义为“元”构成的集合。容易发现,一共有两种不同的“α”。
    第三天, 上帝又创造了一个新的元素,称作“β”。“β”被定义为“α”构成的集合。容易发现,一共有四种不同的“β”。
    第四天, 上帝创造了新的元素“γ”,“γ”被定义为“β”的集合。显然,一共会有16种不同的“γ”。
    如果按照这样下去,上帝创造的第四种元素将会有65536种,第五种元素将会有2^65536种。这将会是一个天文数字。
    然而,上帝并没有预料到元素种类数的增长是如此的迅速。他想要让世界的元素丰富起来,因此,日复一日,年复一年,他重复地创造着新的元素……
    然而不久,当上帝创造出最后一种元素“θ”时,他发现这世界的元素实在是太多了,以致于世界的容量不足,无法承受。因此在这一天,上帝毁灭了世界。
    至今,上帝仍记得那次失败的创世经历,现在他想问问你,他最后一次创造的元素“θ”一共有多少种?
    上帝觉得这个数字可能过于巨大而无法表示出来,因此你只需要回答这个数对p取模后的值即可。
    你可以认为上帝从“α”到“θ”一共创造了10^9次元素,或10^18次,或者干脆∞次。
    一句话题意:
     

    Input

    接下来T行,每行一个正整数p,代表你需要取模的值

    Output

    T行,每行一个正整数,为答案对p取模后的值

    Sample Input

    3
    2
    3
    6

    Sample Output

    0
    1
    4

    HINT

    对于100%的数据,T<=1000,p<=10^7
     

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3884

    思路:
    根据扩展欧拉定理,当$ {b> varphi (p)} $时,有$ a^{b} equiv a^{b mod varphi (p)} mod p $

    于是我们可以设$ f(p)=2^{2^{2^{...}}}mod p $,那么有$ f(1)=0 $

    所以$ f(p)=2^{2^{2^{...}}}mod p =2^{2^{2^{...}} mod varphi (p) + p}mod p= 2^{f(varphi (p))+p}mod p $

     接下来就把欧拉定理和快速幂的板子套上就可以了

    代码:

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 typedef long long ll;
     6 
     7 ll phi(ll n)
     8 {
     9     ll ans = n;
    10 
    11     for(ll i = 2; i * i <= n; i++)
    12 
    13     {
    14         if(n % i == 0)
    15         {
    16             ans = ans / i * (i - 1);
    17             while(n % i == 0)
    18                 n /= i;
    19         }
    20     }
    21     if(n > 1)
    22         ans = ans / n * (n - 1);
    23     return ans;
    24 }
    25 ll ksm(ll a, ll b, ll p)
    26 
    27 {
    28     ll ans = 1;
    29     while(b)
    30 
    31     {
    32         if(b & 1)
    33             ans = (ans * a) % p;
    34         a = (a * a) % p;
    35         b >>= 1;
    36     }
    37     return ans;
    38 }
    39 ll f(ll x)
    40 {
    41     if(x == 1)
    42         return 0;
    43 
    44     ll p = phi(x);
    45 
    46     return ksm(2, f(p) + p, x);
    47 }
    48 int main()
    49 
    50 {
    51     int t;
    52     scanf("%d", &t);
    53     while(t--)
    54     {
    55         ll n;
    56         scanf("%lld", &n);
    57         printf("%lld
    ", f(n) );
    58     }
    59 }
  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/yyaoling/p/12272220.html
Copyright © 2011-2022 走看看