1. 程式人生 > >HDU 5728 PowMod(數論,尤拉函式的各種性質)

HDU 5728 PowMod(數論,尤拉函式的各種性質)

[題意]

k=i=1mϕ(in)%1000000007
其中n為無平方因子的數,求
ans=kkkk...k%p

[分析]

n無平方因子說明n可以表示為n=p1p2...pl(pipj)
尤拉函式為積性函式,有ϕ(nm)=ϕ(n)ϕ(m)(gcd(n,m)=1)
所以可以對每個pi統計貢獻即可算出k

i=1mϕ(in)=f(n,m)i=1mϕ(in)=ϕ(pi)i=1mϕ(inpi)+i=1mpiϕ(in)f(n,m)=ϕ(pi)f(npi,m)+f(n,mpi)
由上式算出k後,再由公式ab%p=ab%ϕ(p)+ϕ(p)%p 遞迴的計算ans,遞迴出口為ϕ
(p)=1

[程式碼]

#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 ; }