输入1个数n(1 <= n <= 10^18)。
输出F(n) % 1000000009的结果。
用普通的循环会超时的。要用矩阵快速幂
#include <cstdio>
#include <cstring>
#define MOD 1000000009
struct juzhen
{
long long aa[2][2];
};
juzhen chengfa(juzhen &a, juzhen &b)
{
juzhen c;
memset(c.aa,0,sizeof(c.aa));
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
{
for (int k = 0; k < 2; k++)
{
c.aa[i][j] = (c.aa[i][j] + a.aa[i][k] * b.aa[k][j]) % MOD;
}
}
return c;
}
juzhen pow(juzhen a, long long n)
{
juzhen ans;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
if (i == j)
ans.aa[i][j] = 1;
else
ans.aa[i][j] = 0;
while (n)
{
if (n & 1)
ans = chengfa(ans, a);
a = chengfa(a, a);
n /= 2;
}
return ans;
}
int main()
{
long long n;
juzhen a, b;
scanf("%lld", &n);
a.aa[0][0] = a.aa[0][1] = a.aa[1][0] = 1;
a.aa[1][1] = 0;
b = pow(a, n);
printf("%lld\n", b.aa[0][1] % MOD);
return 0;
}