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

    3884: 上帝与集合的正确用法

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 2911  Solved: 1300
    [Submit][Status][Discuss]

    Description

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

     

    Input

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

    Output

    T行,每行一个正整数,为答案对p取模后的值
     
     
     
    利用欧拉定理
    这里写图片描述
    这里写图片描述 
    递归求解即可
    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 10000000+10
    const int SIZE=MAXN-10;
    typedef long long LL;
    int tot=0,phi[MAXN],prime[MAXN],is[MAXN];
    void form(){
        memset(is,true,sizeof(is));
        phi[1]=1;is[1]=false;
        for(int i=2;i<=SIZE;i++){
            if(is[i]){
                prime[++tot]=i;
                phi[i]=i-1;
            }
            for(int j=1;j<=tot&&prime[j]*i<=SIZE;j++){
                is[i*prime[j]]=false;
                if(i%prime[j]==0){
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
                else phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
    LL pw(LL a,int b,LL p){
        a%=p;
        LL ans=1;
        for(;b;b>>=1,a=a*a%p)
            if(b&1)ans*=a,ans%=p;
        return ans;    
    }
    LL f(LL p){
        if(p==1)return 0;
        return pw(2,f(phi[p])+phi[p],p);
    }
    int main(){
        form();
        int T;
        scanf("%d",&T);
        while(T--){
            LL p;
            scanf("%lld",&p);
            printf("%lld
    ",f(p));
        }
        return 0;
    }
  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/NINGLONG/p/7711327.html
Copyright © 2011-2022 走看看