题目链接:http://codeforces.com/contest/776/problem/E
题意:
有三个函数 f(n) g(n) Fk(n),已知 n, k,求Fk(n)的值
题解:
我们首先讨论 k=1 时的情况,此时我们的任务变成了求以下方程 x,y 的对数(对数就是 f(n))
这个 x,y 的对数可以使用欧拉函数 phi() 来表示(证明略),结果为 phi(n),然后我们惊奇的发现g(n)恒等于n。
那么我们的任务又变成了求k次 phi(n),这个十分容易,直接暴力即可。(令i = 1..n且i为奇数,我们只需要求出phi(i) 即可,时间复杂度并不高。)
P.S:需要开long long。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int inf = 1 << 26;
LL phi(LL n) {
LL ans = 1; // phi(1) = 1
for ( LL i = 2; i*i <= n; i ++ ) {
if(n%i) continue;
LL p = i-1;
n /= i;
while(n%i == 0) {
n /= i;
p *= i;
}
ans *= p;
}
if(n != 1) ans *= (n-1);
return ans;
}
const LL mod = 1000000007;
int main(){
LL n, k;
scanf("%I64d %I64d", &n, &k);
for ( int i = 1; i <= k && n != 1; i ++ ){
if(i%2 == 1) {
n = phi(n);
}
}
printf("%I64d\n", n%mod);
return 0;
}