zoukankan      html  css  js  c++  java
  • 洛谷 P1962 斐波那契数列

    题意简述

    $ a[1]=a[2]=1 ( ) a[x]=a[x-2]+a[x-1] (x>2) $
    求a数列的第n项对1000000007取余的值。

    题解思路

    矩阵加速
    设$$ F=egin{bmatrix} 0&11&1end{bmatrix}, G=egin{bmatrix} 11end{bmatrix}$$
    则$$ egin{bmatrix} a[n-1]a[n]end{bmatrix} = G * F ^ {n - 2} (n > 2)$$

    代码

    #include <cstdio>
    typedef long long ll;
    const int mod = 1000000007;
    int T, N;
    ll n;
    struct Matrix
    {
    	int a[4][4];
    	Matrix& operator =(const Matrix& x)
    	{
    		for (register int i = 1; i <= N; ++i)
    			for (register int j = 1; j <= N; ++j)
    				a[i][j] = x.a[i][j];
    		return *this;
    	}
    };
    Matrix a, b, c;
    Matrix Mul(const Matrix& x, const Matrix& y)
    {
    	Matrix s;
    	for (register int i = 1; i <= N; ++i)
    		for (register int j = 1; j <= N; ++j)
    			s.a[i][j] = 0;
    	for (register int i = 1; i <= N; ++i)
    		for (register int j = 1; j <= N; ++j)
    			for (register int k = 1; k <= N; ++k)
    				s.a[i][j] = (s.a[i][j] + (ll)x.a[i][k] * y.a[k][j] % mod) % mod;
    	return s;
    }
    Matrix _pow(Matrix x, ll y)
    {
    	Matrix s;
    	for (register int i = 1; i <= N; ++i)
    		for (register int j = 1; j <= N; ++j)
    			s.a[i][j] = (i == j);
    	for (; y; y >>= 1, x = Mul(x, x)) if (y & 1) s = Mul(s, x);
    	return s;
    }
    int main()
    {
    	N = 3;
    	scanf("%lld", &n);
    	c.a[1][1] = c.a[1][2] = 1;
    	a.a[1][1] = a.a[1][2] = a.a[2][1] = 1;
    	if (n <= 2) {printf("1
    "); return 0; }
    	b = Mul(c, _pow(a, n - 2));
    	printf("%d
    ", b.a[1][1]);
    }
    
  • 相关阅读:
    [BZOJ]1854: [Scoi2010]游戏
    [BZOJ]3531: [Sdoi2014]旅行
    2017-3-30校内训练
    Codeforces Round #407 (Div. 1)
    [BZOJ]1064: [Noi2008]假面舞会
    Educational Codeforces Round 18
    [BZOJ]1503: [NOI2004]郁闷的出纳员
    [BZOJ]1758: [Wc2010]重建计划
    2017-3-26四校联考
    [BZOJ]4644: 经典傻逼题
  • 原文地址:https://www.cnblogs.com/xuyixuan/p/9806644.html
Copyright © 2011-2022 走看看