HDU 5728 PowMod(數論,尤拉函式的各種性質)
阿新 • • 發佈:2019-01-24
[題意]
其中n為無平方因子的數,求
[分析]
n無平方因子說明n可以表示為
尤拉函式為積性函式,有
所以可以對每個
由上式算出k後,再由公式
[程式碼]
#include <bits/stdc++.h>
using namespace std ;
const int N = 1e7 + 5 ;
const int mod = 1e9 + 7 ;
typedef long long LL ;
int T , n , m , p ;
int f[N] , s[N] ;
void init()
{
f[1] = 1 ;
for( int i = 2 ; i < N ; i++ )
{
if( f[i] ) continue ;
f[i] = i-1 ;
for( int j = i+i ; j < N ; j += i )
{
if( !f[j] ) f[j] = j ;
f[j] = f[j]/i*(i-1) ;
}
}
for( int i = 1 ; i < N ; i++ )
s[i] = ( s[i-1] + f[i] ) % mod ;
}
LL get( int n , int m )
{
if( m < 1 ) return 0 ;
if( m == 1 ) return f[n] ;
if( n == 1 ) return s[m] ;
if( f[n] == n-1 ) return ( get(1,m) * f[n] % mod + get(n,m/n) ) % mod ;
for( int i = 2 ; i*i <= n ; i++ )
{
if( n%i ) continue ;
return ( f[i] * get(n/i,m) % mod + get(n,m/i) ) % mod ;
}
}
LL powMod( LL a , LL b , LL p )
{
LL r = 1 ;
a %= p ;
while( b )
{
if( b&1 ) r = r*a%p ;
b >>= 1 ;
a = a*a%p ;
}
return r ;
}
LL gao( LL k , LL p )
{
if( p == 2 ) return k&1 ;
return powMod(k,gao(k,f[p])+f[p],p) ;
}
int main()
{
init() ;
while( ~scanf( "%d%d%d" , &n , &m , &p ) )
{
LL k = get(n,m) ;
printf( "%I64d\n" , gao(k,p) ) ;
}
return 0 ;
}