f(n)表示斐波那契数列的第n项
F(n) = a^f(n-1)*b^f(n) 这个推一下就知道了
然后f(n)可以用矩阵快速幂求
1 1 f(n+1) f(n)
1 0 的n次幂 = f(n) f(n-1) 就行了(至于为什么有这个自己度娘把。。)
但关键点在于f(n)可能很大 a^f(n-1)不好求
但是我们有费马小定理 a^p-1 = 1(mod p) p是质数 1000000007是质数 所以a^1000000006=1 (mod 1000000007)
所以我们只需要求f(n-1)%1000000006的值就行了 然后答案就是a^(f(n-1)%1000000006)*b^((f(n)%1000000006))%1000000007
附一个Java的代码= = 最近在写Java项目,一直开的eclipse 没写C++的 不过思路是一样的。。。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static InputReader in = new InputReader();
private static final int MOD = 1000000007;
private static final long[][] gen = { { 1, 1 }, { 1, 0 } };
private static long pow(long n, long a) {
if (a == 0)
return 1;
if (a == 1)
return n;
long ret = pow(n, a / 2);
ret *= ret;
ret %= MOD;
if (a % 2 != 0)
ret = ret * n;
ret %= MOD;
return ret;
}
private static long[][] quick(long[][] m, int a) {
if (a == 0) {
long[][] ret = new long[2][2];
ret[0][0] = ret[1][1] = 1;
ret[0][1] = ret[1][0] = 0;
return ret;
}
if (a == 1)
return gen;
else {
long[][] mm = quick(gen, a / 2);
long[][] ret = new long[2][2];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) {
ret[i][j] = 0;
for (int k = 0; k < 2; k++) {
ret[i][j] += mm[i][k] * mm[k][j];
ret[i][j] %= MOD - 1;
}
}
if (a % 2 != 0) {
long rett[][] = new long[2][2];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
rett[i][j] += ret[i][k] * gen[k][j];
rett[i][j] %= MOD - 1;
}
}
return rett;
}
return ret;
}
}
public static void main(String[] args) {
int a, b, n;
try {
while (true) {
a = in.nextInt();
b = in.nextInt();
n = in.nextInt();
if (n == 0) {
System.out.println(a);
} else if (n == 1) {
System.out.println(b);
} else {
long[][] ret = quick(gen, n - 1);
long ans = pow(b, ret[0][0]);
ans *= pow(a, ret[0][1]);
ans %= MOD;
System.out.println(ans);
}
}
} catch (Exception e) {
}
}
}
class InputReader {
BufferedReader br;
StringTokenizer st;
public InputReader(String s) {
try {
br = new BufferedReader(new FileReader(s));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public InputReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String nextToken() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return st.nextToken();
}
String nextLine() {
try {
return br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
int nextInt() {
return Integer.parseInt(nextToken());
}
long nextLong() {
return Long.parseLong(nextToken());
}
double nextDouble() {
return Double.parseDouble(nextToken());
}
}