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=1∑mφ(i∗n) 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=1∑mφ(i∗n) mod 1000000007
φ
\varphi
φ为欧拉函数
思路
设
S
(
m
,
n
)
=
∑
i
=
1
m
φ
(
i
∗
n
)
S(m,n)=∑^m_{i=1}φ(i∗n)
S(m,n)=i=1∑mφ(i∗n)
由于n为无平方因子数,所以n能拆成
n
=
p
1
p
2
⋯
p
i
n=p_1p_2\cdots p_i
n=p1p2⋯pi,其中
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=p2⋯pi是互质的
那么考虑一下原式有
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=1∑mφ(d∗i∗dn)
由于
φ
\varphi
φ为积性函数,若
i
i
i与
j
j
j互质那么有
φ
(
i
j
)
=
φ
(
i
)
φ
(
j
)
\varphi(ij)=\varphi(i)\varphi(j)
φ(ij)=φ(i)φ(j)
考虑
1
−
m
1-m
1−m中的
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})
φ(d∗i∗dn)=φ(d)φ(i∗dn),若
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∗(1−p11)(1−p21)⋯(1−pi1)
有
φ
(
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})
φ(i∗dn)=i∗dn∗(1−p11)(1−p21)⋯(1−pi1)
而
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})
φ(d∗i∗dn)=d∗i∗dn∗(1−p11)(1−p21)⋯(1−pi1)=d∗φ(i∗dn)
由于
d
d
d为素数
φ
(
d
)
=
d
−
1
\varphi(d)=d-1
φ(d)=d−1所以上式可以变为
φ
(
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})
φ(d∗i∗dn)=(φ(d)+1))∗φ(i∗dn)=φ(d)∗φ(i∗dn)+φ(i∗dn)
可以看出不管
d
d
d与
i
i
i互不互质,都有
φ
(
d
)
∗
φ
(
i
∗
n
d
)
\varphi(d)*\varphi(i∗\frac{n}{d})
φ(d)∗φ(i∗dn)这一项,所以有
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=1∑mφ(i∗dn)+i=1,gcd(i,d)̸=1∑mφ(i∗dn)
观察后面的部分
φ
(
i
∗
n
d
)
\varphi(i∗\frac{n}{d})
φ(i∗dn)我们把分母换一换(由于
i
i
i与
d
d
d不互质所以可以换)换到i下面就有
φ
(
i
d
∗
n
)
\varphi(\frac{i}{d}∗n)
φ(di∗n)然后换元有
∑
i
=
1
m
d
φ
(
i
∗
n
)
\sum_{i=1}^{\frac{m}{d}}\varphi(i∗n)
i=1∑dmφ(i∗n)
也可以从
1
−
m
1-m
1−m中枚举有多少个
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=1∑mφ(i∗dn)+i=1∑dmφ(i∗n)
即
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=1∑mφ(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;
}