#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int M=1e9+7;
const int N=1e6+10;
int prime[N],h;
void getprime()
{
memset(prime,0,sizeof prime);
for (int i=2;i<N;i++)if (!prime[i]){
prime[h++]=i;
for (int j=i+i;j<N;j+=i) prime[j]=i;
}
}
LL phi(LL n){
LL m=n;
for (int i=0;i<h && prime[i]<=n;i++)if (n%prime[i]==0){
m=m/prime[i]*(prime[i]-1);
while (n%prime[i]==0)n/=prime[i];
}
if (n>1)m=m/n*(n-1);
return m;
}
int main()
{
LL n,k;
getprime();
cin>>n>>k;
for (LL i=1;i<=(k+1)/2;i++){
n=phi(n);
if (n==1)break;
}
cout<<(n%=M);
return 0;
}
/*
题目: http://codeforces.com/contest/776/problem/E
题意: f(1)=1,f(n)是满足x+y=n且gcd(x,y)=1的(x,y)的有序正整数对的个数;g(n)是所有f(n/d)的和(其中d是n的约数)。求Fk(n),具体看链接吧
题解: 对于f(n), gcd(x,y)=gcd(x,n-x)=gcd(x,n)=1,f(n)即是欧拉函数; f(n/d)=A(d), A(d)是小于等于n且与n的最大公约数为d的数的个数,则g(n)=n;对于Fk(n)为对n求(k+1)/2次欧拉函数
*/
codeforces Round 400 E-The Holmes Children
最新推荐文章于 2020-03-02 10:22:28 发布