TengBieBie已经学习了很多关于斐波那切数列的性质,所以他感到一些些厌烦。现在他遇到了一个新的数列,这个数列叫做Float-Bonacci。这里有一个关于Float-Bonacci的定义。
对于一个具体的n,TengBieBie想要快速计算FB(n).
但是TengBieBie对FB的了解非常少,所以他向你求助。
你的任务是计算FB(n).FB(n)可能非常大,请输出FB(n)%1,000,000,007(1e9+7)即可。
Input
输入共一行,在一行中给出一个整数n (1<=n<=1,000,000,000)。
Output
对于每一个n,在一行中输出FB(n)%1,000,000,007 (1e9+7)。
Input示例
5
Output示例
2#include <iostream> #include <cstring> using namespace std; typedef long long int ll; const int mod = 1e9 + 7; struct matrix { ll v[17][17]; }; matrix multi(matrix a, matrix b) { matrix result; memset(result.v, 0, sizeof(result.v)); for (int i = 0; i < 17; i++) { for (int j = 0; j < 17; j++) { for (int k = 0; k < 17; k++) { result.v[i][j] += (a.v[i][k] * b.v[k][j]); result.v[i][j] %= mod; } } } return result; } matrix quick_power(matrix a, ll k) { matrix b; memset(b.v, 0, sizeof(b.v)); for (int i = 0; i < 17; i++) { b.v[i][i] = 1; } while (k) { if (k & 1) { b = multi(a, b); } a = multi(a, a); k >>= 1; } return b; } int main() { ll n; cin >> n; if (n <= 4) { cout << 1 << endl; return 0; } matrix x; memset(x.v, 0, sizeof(x.v)); for (int i = 0; i <= 4; i++) { x.v[i][i] = 1; x.v[i][i+12] = 1; } for (int i = 5; i <= 16; i++) { x.v[i][i-5] = 1; } ll result = 0; matrix y = quick_power(x, n-4); for (int i = 0; i < 17; i++) { result += y.v[0][i]; result %= mod; } cout << result << endl; return 0; }