zoukankan      html  css  js  c++  java
  • Bzoj3884 上帝与集合的正确用法

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 1656  Solved: 761

    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


    Source

    By PoPoQQQ

    数学问题 欧拉函数 欧拉定理

    直接套用欧拉定理分解原式:

      $ 2^x mod p=2^{(x mod phi(p))+phi(p)}mod p $

    递归计算即可

    破水题居然没有1A

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #define LL long long
     7 using namespace std;
     8 const int mxn=100010;
     9 int read(){
    10     int x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 int T,P;
    16 int ksm(int a,int k,int p){
    17     int res=1;
    18     while(k){
    19         if(k&1)res=(LL)res*a%p;
    20         a=(LL)a*a%p;
    21         k>>=1;
    22     }
    23     return res;
    24 }
    25 int phi(int x){
    26     int res=x;
    27     int m=sqrt(x+0.5);
    28     for(int i=2;i<=m;i++){
    29         if(x%i==0){
    30             while(x%i==0)x/=i;
    31             res=res/i*(i-1);
    32         }
    33     }
    34     if(x>1)res=res/x*(x-1);
    35     return res;
    36 }
    37 int solve(int x){
    38     if(x==1)return 0;
    39     int ph=phi(x);
    40     return ksm(2,solve(phi(x))+phi(x),x);
    41 }
    42 int main(){
    43     int i,j,p;
    44     T=read();
    45     while(T--){
    46         p=read();
    47         printf("%d
    ",solve(p));
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6875750.html
Copyright © 2011-2022 走看看