bzoj3884 欧拉降幂

题目传送门

题意:

题解:

看了这篇博客才会的。

\begin{aligned} f(p) &= 2^{2^{...}} (mod\;p) \\ &= 2^{2^{2^{...}}mod\;\varphi(p)+\varphi(p)}(mod\;p) \\ &=2^{f(\varphi(p))+\varphi(p)}(mod p) \end{aligned}

递归处理即可。

递归终点是 p=1 , 任何正整数模1都等于0,返回0即可。

感受:

知道了欧拉降幂是干什么用的。

代码:

#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
ll phi(ll n)
{
   ll ans = n ;
   for(ll i = 2 ; i * i <= n ; i ++)
   {
     if(n % i == 0)
     {
       ans -= ans / i ;
       while(n % i == 0)  n /= i ;
     }
   }
   if(n > 1)  ans -= ans / n ;
   return ans ;
}
ll qpow(ll a , ll b , ll mod)
{
   ll ans = 1 ; 
   while(b)
   {
     if(b & 1)  ans = ans * a % mod ;
     b >>= 1 , a = a * a % mod ;
   }
   return ans % mod ;
}
ll solve(ll p)
{
    if(p == 1)  return 0 ;
    ll phi_p = phi(p) ;
    return  qpow(2 , solve(phi_p) + phi_p , p) ;
}
int main()
{
    int t ;
    scanf("%d" , &t) ;
    while(t --)
    {
        ll p ;
        scanf("%lld" , &p) ;
        printf("%lld\n" , solve(p)) ;
    }
    return 0 ;
}
发布了215 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Irving0323/article/details/104133739
今日推荐