斐波那契

斐波那契

Problem:

Keven 特别喜欢斐波那契数列,已知 \(fib_1=1\)\(fib_2=1\),对于 \(n\geq3\),f\(fib_{n}=fib_{n-2}+fib_{n-1}\),并且他想知道斐波那契前 n 项平方和是多少?

为了防止答案过大,请将最后的答案模 1e9+7

Input:

第一行一个整数 n(1<=n<=1e18)

Output:

在一行中输出斐波那契数列的前 n 项平方和模 1e9+7

Example:

input

5

output

40

note

\(1^2+1^2+2^2+3^2+5^2=40\)

Solution:

找规律发现结果为

\[a_{n}=fib_{n}*fib_{n-1} \]

因为n可以取到1e18,所以fib需要用矩阵快速幂求

fib的递推式:

\[fib[i]=fib[i-1]+fib[i-2]\\fib[i-1]=fib[i-1]\\即:\\fib[i]=1*fib[i-1]+1*fib[i-2]\\fib[i-1]=1*fib[i-1]+0*fib[i-2]\\即:\\\begin{bmatrix}fib[n]\\fib[n-1]\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}\times\begin{bmatrix}fib[n-1]\\fib[n-2]\end{bmatrix}\\\Leftrightarrow\\\begin{bmatrix}fib[n]\\fib[n-1]\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-1}\times\begin{bmatrix}fib[1]\\fib[0]\end{bmatrix} \]

Code:

#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define CSE(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define Abs(x) (x>=0?x:(-x))
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int maxn = 111111;
const ll mod = 1e9 + 7;
ll ans[2] = { 1,0 };
ll sp[2][2] = { {1,1},{1,0} };

void qpow(ll n) {
	while (n) {
		if (n & 1) {
			ll mid[2] = { 0,0 };
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < 2; j++) {
					mid[i] = (mid[i] + (ans[j] * sp[i][j]) % mod) % mod;
				}
			}
			ans[0] = mid[0]; ans[1] = mid[1];
		}
		n >>= 1;
		ll mid[2][2] = { {0,0},{0,0} };
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < 2; j++) {
				for (int k = 0; k < 2; k++) {
					mid[i][j] = (mid[i][j] + (sp[i][k] * sp[k][j]) % mod) % mod;
				}
			}
		}
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < 2; j++) {
				sp[i][j] = mid[i][j];
			}
		}
	}
	return;
}

int main()
{
	ll n;
	cin >> n;
	qpow(n);
	cout << ans[0] * ans[1] % mod << endl;
	return 0;
}
posted @ 2020-08-17 09:32  落水清心  阅读(154)  评论(0编辑  收藏  举报