HDU 5728 PowMod (递归式+欧拉降幂)

博客围绕PowMod问题展开,给出问题描述,包括输入输出示例。问题要求根据给定的无平方因子数n、m、p,求k的无限次幂模p,其中k是特定求和式模1000000007的值。解题思路是先递归求解S(m,n),再用欧拉降幂处理k的无限次幂。

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

PowMod
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1599 Accepted Submission(s): 559

Problem Description
Declare:
k = ∑ i = 1 m φ ( i ∗ n )   m o d   1000000007 k=∑^m_{i=1}φ(i∗n)\ mod \ 1000000007 k=i=1mφ(in) mod 1000000007

n is a square-free number.

φ is the Euler’s totient function.

find:
a n s = k k k k . . . k m o d p ans=k^{k^{k^{k^{...k}}}} mod p ans=kkkk...kmodp

There are infinite number of k

Input
Multiple test cases(test cases ≤100), one line per case.

Each line contains three integers, n,m and p.

1≤n,m,p≤107

Output
For each case, output a single line with one integer, ans.

Sample Input
1 2 6
1 100 9

Sample Output
4
7

题意

给你n(n为无平方因子数),m,p,然后要你求k的k次幂的k次幂的无限个k次幂模p,其中k为
k = ∑ i = 1 m φ ( i ∗ n )   m o d   1000000007 k=∑^m_{i=1}φ(i∗n)\ mod \ 1000000007 k=i=1mφ(in) mod 1000000007
φ \varphi φ为欧拉函数

思路


S ( m , n ) = ∑ i = 1 m φ ( i ∗ n ) S(m,n)=∑^m_{i=1}φ(i∗n) S(m,n)=i=1mφ(in)
由于n为无平方因子数,所以n能拆成 n = p 1 p 2 ⋯ p i n=p_1p_2\cdots p_i n=p1p2pi,其中 p i p_i pi为不同的素数
那么我们取其中一个素因子记 d = p 1 d=p_1 d=p1,那么 d d d n d = p 2 ⋯ p i \frac{n}{d}=p_2\cdots p_i dn=p2pi是互质的
那么考虑一下原式有
S ( m , n ) = ∑ i = 1 m φ ( d ∗ i ∗ n d ) S(m,n)=\sum^m_{i=1}\varphi(d∗i∗\frac{n}{d}) S(m,n)=i=1mφ(didn)
由于 φ \varphi φ为积性函数,若 i i i j j j互质那么有 φ ( i j ) = φ ( i ) φ ( j ) \varphi(ij)=\varphi(i)\varphi(j) φ(ij)=φ(i)φ(j)
考虑 1 − m 1-m 1m中的 i i i d d d的关系,对于 i i i d d d互质的部分那么有 φ ( d ∗ i ∗ n d ) = φ ( d ) φ ( i ∗ n d ) \varphi(d∗i∗\frac{n}{d})=\varphi(d)\varphi(i∗\frac{n}{d}) φ(didn)=φ(d)φ(idn),若 i i i d d d不互质的话,根据
φ ( n ) = n ∗ ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p i ) \varphi(n)=n*(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_i}) φ(n)=n(1p11)(1p21)(1pi1)

φ ( i ∗ n d ) = i ∗ n d ∗ ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p i ) \varphi(i∗\frac{n}{d})=i∗\frac{n}{d}*(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_i}) φ(idn)=idn(1p11)(1p21)(1pi1)
d d d i i i不互质那么 d d d有的因子肯定是 i i i的子集
φ ( d ∗ i ∗ n d ) = d ∗ i ∗ n d ∗ ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p i ) = d ∗ φ ( i ∗ n d ) \varphi(d∗i∗\frac{n}{d})=d∗i∗\frac{n}{d}*(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_i})=d∗\varphi(i∗\frac{n}{d}) φ(didn)=didn(1p11)(1p21)(1pi1)=dφ(idn)
由于 d d d为素数 φ ( d ) = d − 1 \varphi(d)=d-1 φ(d)=d1所以上式可以变为
φ ( d ∗ i ∗ n d ) = ( φ ( d ) + 1 ) ) ∗ φ ( i ∗ n d ) = φ ( d ) ∗ φ ( i ∗ n d ) + φ ( i ∗ n d ) \varphi(d∗i∗\frac{n}{d})=(\varphi(d)+1))∗\varphi(i∗\frac{n}{d})=\varphi(d)*\varphi(i∗\frac{n}{d})+\varphi(i∗\frac{n}{d}) φ(didn)=(φ(d)+1))φ(idn)=φ(d)φ(idn)+φ(idn)
可以看出不管 d d d i i i互不互质,都有 φ ( d ) ∗ φ ( i ∗ n d ) \varphi(d)*\varphi(i∗\frac{n}{d}) φ(d)φ(idn)这一项,所以有

S ( m , n ) = φ ( d ) ∑ i = 1 m φ ( i ∗ n d ) + ∑ i = 1 , g c d ( i , d ) ≠ 1 m φ ( i ∗ n d ) S(m,n)=\varphi(d)\sum_{i=1}^m\varphi(i∗\frac{n}{d})+\sum_{i=1,gcd(i,d)\neq 1}^m\varphi(i∗\frac{n}{d}) S(m,n)=φ(d)i=1mφ(idn)+i=1,gcd(i,d)̸=1mφ(idn)
观察后面的部分 φ ( i ∗ n d ) \varphi(i∗\frac{n}{d}) φ(idn)我们把分母换一换(由于 i i i d d d不互质所以可以换)换到i下面就有 φ ( i d ∗ n ) \varphi(\frac{i}{d}∗n) φ(din)然后换元有
∑ i = 1 m d φ ( i ∗ n ) \sum_{i=1}^{\frac{m}{d}}\varphi(i∗n) i=1dmφ(in)
也可以从 1 − m 1-m 1m中枚举有多少个 d d d的倍数方向思考,那么原式就有
S ( m , n ) = φ ( d ) ∑ i = 1 m φ ( i ∗ n d ) + ∑ i = 1 m d φ ( i ∗ n ) S(m,n)=\varphi(d)\sum_{i=1}^m\varphi(i∗\frac{n}{d})+\sum_{i=1}^{\frac{m}{d}}\varphi(i∗n) S(m,n)=φ(d)i=1mφ(idn)+i=1dmφ(in)


S ( m , n ) = φ ( d ) S ( m , n d ) + S ( m d , n ) S(m,n)=\varphi(d)S(m,\frac{n}{d})+S(\frac{m}{d},n) S(m,n)=φ(d)S(m,dn)+S(dm,n)
那就可以用递归来求解 S ( m , n ) S(m,n) S(m,n)了出口为 m = = 0 m==0 m==0返回 0 0 0 n = = 1 n==1 n==1
S ( m , 1 ) = ∑ i = 1 m φ ( i ) S(m,1)=\sum_{i=1}^m\varphi(i) S(m,1)=i=1mφ(i)
可以预处理一下欧拉函数的前缀和
k解决之后
来考虑k的无限次幂
欧拉降幂有
在这里插入图片描述
可以根据第一条和第三条递归上去,也可以先处理模数当欧拉函数为1的时候就不用继续算下去了,上面的取模后就都为0了也就没有意义了,然后再从后面往前一次带入下一次的答案

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int N=1e7+5;
int phi[N];
int prime[N];
bool vis[N];
int cnt;
long long Phi[N];
void init()
{
    cnt=0;
    phi[1]=1;
    for(int i=2;i<N;i++)
    {
        if(!vis[i])
        {
            prime[cnt++]=i;
            phi[i]=i-1;
        }
        for(int j=0;j<cnt&&prime[j]*i<N;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
    for(int i=1;i<N;i++)
        Phi[i]=(Phi[i-1]+phi[i])%mod;
}
long long f(long long m,long long n)
{
    if(m==0) return 0;
    if(n==1) return Phi[m];
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            return (phi[i]%mod*f(m,n/i)%mod+f(m/i,n)%mod)%mod;
        }
    }
        return (phi[n]%mod*f(m,n/n)%mod+f(m/n,n)%mod)%mod;
}
long long quickmod(long long a,long long b,long long p)
{
    long long ans=1;
    while(b)
    {
        if(b%2==1)
            ans=ans*a%p;
        a=a*a%p;
        b=b/2;
    }
    return ans;
}
int a[N];
int main()
{
    init();
    int n,m,p;
    while(scanf("%d%d%d",&n,&m,&p)!=EOF)
    {
        long long k=f(m,n)%mod;
        a[0]=p;
        long long l;
        for(int i=1;;i++)
        {
            if(phi[a[i-1]]==1)
            {
                a[i]=phi[a[i-1]];
                l=i;
                break;
            }
            a[i]=phi[a[i-1]];
        }
        long long ans=1;
        for(int i=l-1;i>=0;i--)
        {
            ans=quickmod(k,ans%a[i+1]+a[i+1],a[i]);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值