• 斐波那契


    斐波那契

    Problem:

    Keven 特别喜欢斐波那契数列,已知 (fib_1=1)(fib_2=1),对于 (ngeq3),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]\即:\egin{bmatrix}fib[n]\fib[n-1]end{bmatrix}=egin{bmatrix}1&1\1&0end{bmatrix} imesegin{bmatrix}fib[n-1]\fib[n-2]end{bmatrix}\Leftrightarrow\egin{bmatrix}fib[n]\fib[n-1]end{bmatrix}=egin{bmatrix}1&1\1&0end{bmatrix}^{n-1} imesegin{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;
    }
    
  • 相关阅读:
    mock.js 模拟数据
    pa
    观察者模式
    WebSocket
    Nginx官方文档学习
    Java中文乱码解决
    Jersey+Spring+Maven(转)
    App架构经验总结(转)
    JSONP跨域的原理解析(转)
    mongoDB学习
  • 原文地址:https://www.cnblogs.com/LeafLove/p/13515845.html
Copyright © 2020-2023  润新知