【luogu P4139】 上帝与集合的正确用法

  传送门

这道题题面很长(废话一堆), 但是总结就一句话题意:2^2^2^2……mod p

因为当 φ(p) 时,a ^ ≡ a ^ (bmodφ(pφ(p))。所以我们可以递归地算这个式子,直到 p = 1

即令f(p2 ^ 2 ^ 2⋯ mod p,则有f(p2^ (f(φ(p)φ(p)) mod p。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#define int long long
typedef long long ll;
using namespace std;
const int maxn = 1e7 + 100;
int get(ll x, int y, int z)
{
    int cnt = 1;
    for(;y;(x *= x) %= z,y >>= 1)
    if(y & 1)
    (cnt *= x) %= z;
    return cnt;
}
signed phi[maxn];
ll solve(int p)
{
    if(p == 1)
    return 0;
    return get(2,solve(phi[p]) + phi[p],p); 
}
int t, p;
signed main()
{
    phi[1] = 1;
    for(signed i = 2;i < maxn;i++)
    if(!phi[i])
    {
        for(signed j = i; j < maxn; j += i)
        {
            if(!phi[j])
            phi[j] = j;
            phi[j] = phi[j] / i * (i - 1);
        }
    }
    for(scanf("%lld", &t);t--;)
    {
        scanf("%lld", &p);
        printf("%lld\n",solve(p));
    }
    return 0;
}
View Code

 

posted @ 2019-07-25 09:59  机器闵  阅读(161)  评论(0编辑  收藏  举报