[题意]
k = ∑i=1mϕ(i∗n)%1000000007
其中n为无平方因子的数,求
ans = kkkk...k%p
[分析]
n无平方因子说明n可以表示为
n =p1∗p2∗...∗pl (pi≠pj)
欧拉函数为积性函数,有
ϕ(n∗m) = ϕ(n)∗ϕ(m) (gcd(n,m)=1)
所以可以对每个
pi
统计贡献即可算出
k
由上式算出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 ;
}