• BZOJ 3884 上帝与集合的正确用法题解


    一道智慧题

    其实解这题需要用到扩展欧拉定理,

    有了上面的公式,我们不难看出此题的解法。

    设b为2^2^2^2^2.....显然,b要比φ(p)要大,所以可以直接套公式

    modp时的答案

    ans(p)=pow(2,ans(φ(p))+φ(p))%p

    而边界是p=1时,ans(1)显然为0,这样递推就好了

    # include<iostream>
    # include<cstdio>
    # include<cmath>
    # include<algorithm>
    const int mn = 1e7;
    int phi[mn+10];
    int t;
    long long p;
    void pre()
    {
        phi[1]=1;
        for(int i=2;i<=mn;i++)
        {
            if(!phi[i])
            {
                for(int j=i;j<=mn;j+=i)
                {
                   if(!phi[j])
                      phi[j]=j;
                   phi[j]=phi[j]/i*(i-1);
                }
            }
        }
    }
    long long qpow(int a,int b,int rqy)
    {
        long long ans=1,base=a;
        while(b)
        {
            if(b&1)
                ans=ans*base%rqy;
            base=base*base%rqy;
            b>>=1;
        }
        return ans;
    }
    long long work(long long rqy)
    {
       if(rqy==1)
            return 0;
       return qpow(2,work(phi[rqy])+phi[rqy],rqy);
    }
    int main()
    {
        pre();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&p);
            printf("%lld
    ",work(p));
        }
        return 0;
    }

     

  • 相关阅读:
    c++类的知识点(1)
    并查集经典例题分析
    并查集
    bfs-迷宫
    出栈次序--数学归纳法--蓝桥
    九宫重排
    Tomcat详解
    寒假日记-第三天
    寒假日记-第二天(MySQL语句)
    Java学期总结
  • 原文地址:https://www.cnblogs.com/logeadd/p/8708374.html
Copyright © 2020-2023  润新知