CF776E The Holmes Children(欧拉函数+狄利克雷卷积)
题目描述
\(f(1)=1,f(n)=\displaystyle\sum_{i=1}^{n}[\gcd(i,n-i)=1](n\geq 2)\),\(g(n)=\displaystyle\sum_{d\mid n}f(\frac{n}{d})\)。
\[F_k(n)=\begin{cases}f(g(n))&k=1\\
g(F_{k-1}(n))&k>1\&\&k\mod 2=0\\
f(F_{k-1}(n))&k>1\&\&k\mod 2=1
\end{cases}
\]
其中 \(1\leq n\leq 10^{12},1\leq k\leq 10^{12}\),求 \(F_k(n)\),答案对 \(10^9+7\) 取模。
分析
首先:
\[\gcd(i,n-i)=\gcd((n-i)\%i,i)=\gcd(n\% i,i)=\gcd(i,n)
\]
所以
\[\begin{aligned}&f(n)\\
=&\sum_{i=1}^{n}[\gcd(i,n-i)=1]\\
=&\sum_{i=1}^{n}[\gcd(i,n)=1]\\
=&\varphi(n)
\end{aligned}
\]
\[\begin{aligned}
&g(n)\\
=&\sum_{d\mid n}\varphi(\frac{n}{d})\\
=&\sum_{d\mid n}\varphi(\frac{n}{d})·1\\
\end{aligned}
\]
由于 \(\varphi \ast I=\mathbf{id}\),所以 \(g(n)=n\)。
\[F_k(n)=\begin{cases}\varphi(n)&k=1\\
F_{k-1}(n)&k>1\&\&k\mod 2=0\\
\varphi(F_{k-1}(n))&k>1\&\&k\mod 2=1
\end{cases}
\]
可以发现 \(F_k(n)\) 的值就是对 \(n\) 求 \(\lfloor\frac{k+1}{2}\rfloor\) 次欧拉函数。但是 \(k\) 的值很大,不可能真的求 \(\lfloor\frac{k+1}{2}\rfloor\) 次,由于 \(n\) 求 \(O(\log n)\) 次欧拉函数的值就是 \(1\),此时再求欧拉函数就没有意义了,所以求 \(\max(\log n,\lfloor\frac{k+1}{2}\rfloor)\) 即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
int prime[N+10],vis[N+10],cnt;
void init()
{
for(int i=2;i<=N;i++)
{
if(!vis[i])
prime[++cnt]=i;
for(int j=1;i*prime[j]<=N&&j<=cnt;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
long long phi(long long n)
{
long long ans=n;
for(int i=1;i<=cnt&&1LL*prime[i]*prime[i]<=n;i++)
{
if(n%prime[i])
continue;
ans=ans/prime[i]*(prime[i]-1);
while(n%prime[i]==0)
n=n/prime[i];
}
if(n>1)
ans=ans/n*(n-1);
return ans;
}
int main()
{
init();
long long n,k;
scanf("%lld%lld",&n,&k);k=(k+1)/2;
for(long long i=1;i<=k&&n>1;i++)
n=phi(n);
printf("%lld\n",n%mod);
return 0;
}
posted on 2020-11-17 12:42 DestinHistoire 阅读(100) 评论(0) 收藏 举报
浙公网安备 33010602011771号