牛客練習賽32

斐波那契數列卷積

theme:給定n,求an,其中an遞推式爲:

solution:首先推出an遞推式:

推出矩陣A:

下面編碼採用An-1、fn等順序不一樣,可自行推導:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define far(i,t,n) for(int i=t;i<n;++i)
#define pk(a) push_back(a)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int inf=0x3f3f3f3f;
int mod=998244353;
 
struct mat
{
    ll var[10][10];
    mat()
    {
        far(i,0,10)
            far(j,0,10)
                var[i][j]=0;
    }
    void init()
    {
        var[0][0]=var[0][1]=var[0][2]=1;
        var[1][0]=1;
        var[2][2]=var[2][3]=1;
        var[3][2]=1;
    }
    mat operator*(mat b)const
    {
        mat ans;
        far(i,0,4)
            far(j,0,4)
            {
                ll sum=0;
                far(k,0,4)
                    sum=(sum+var[i][k]*b.var[k][j]%mod)%mod;
                ans.var[i][j]=sum;
            }
        return ans;
    }
};
 
mat quickMatPow(mat a,ll b)
{
    mat ans;
    far(i,0,4)
        ans.var[i][i]=1;
    while(b)
    {
        if(b%2)
            ans=ans*a;
        a=a*a;
        b/=2;
    }
    return ans;
}
 
int main()
{
    ll n;
    while(scanf("%lld",&n)!=EOF)
    {
        mat a;
        a.init();
        a=quickMatPow(a,n-1);
        printf("%lld\n",a.var[0][2]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章