HDU 5728 PowMod(数论,欧拉函数的各种性质)

该博客介绍了如何解决HDU 5728 PowMod问题,重点在于数论中的欧拉函数及其性质。通过分析n无平方因子的情况,利用欧拉函数的积性来简化计算,对每个质因数的贡献进行统计以得出答案。文章包含题意解析、问题分析以及相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[题目链接]

[题意]

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 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值