1041 粉嘤花之恋 矩阵乘法

链接:https://ac.nowcoder.com/acm/contest/26656/1041
来源:牛客网

题目描述

qn是个特别可爱的小哥哥,qy是个特别好的小姐姐,他们两个是一对好朋友 [ cp (划掉~)
又是一年嘤花烂漫时,小qn于是就邀请了qy去嘤花盛开的地方去玩。当qy和qn来到了田野里时,qy惊奇的发现,嘤花花瓣以肉眼可见的速度从树上长了出来。
仔细看看的话,花瓣实际上是以一定规律长出来的,而且,每次张成新的花瓣的时候,上一次的花瓣就会都落到地上,而且不会消失。
花瓣生长的规律是,当次数大于等于2时,第i次长出来的花瓣个数和上一次张出来的花瓣个数的差是斐波那契数列的第i-1项。初始的时候地上没有花瓣,树上的花瓣个数为1,第一次生长的花瓣个数为1。初始的那个花瓣就落到了地上
现在,小qn想知道,经过k次生长之后,树上和地上的总花瓣个数是多少?
ps:斐波那契数列:
    f[1]=f[2]=1;f[i]=f[i-1]+f[i-2] (i>=2且i ∈\in∈  N+

输入描述:

一行一个数k

输出描述:

一行一个数m,表示第k次生长过后,树上和地上的总花瓣数是多少。由于答案会很大,请你将答案mod 998244353后输出
示例1

输入

复制
4

输出

复制
12

说明

第一次:树上1,地上1.第二次树上2,地上1+1,第三次树上3,地上1+1+2,第四次树上5,地上1+1+2+3。总共12个
示例2

输入

复制
5

输出

复制
20

说明

第五次树上8,地上1+1+2+3+5。总共20个

备注:

对于0%的数据,有k=样例
对于20%的数据,有k<=1'000
对于60%的数据,有k<=1'000'000
对于80%的数据,有k<=1'000'000'000
对于100%的数据,有k<1'000'000'000'000'000'000

 分析

计算前n项和,多开一维就可以了,不过注意是 x * f 不是 f * x。。

//-------------------------代码----------------------------

#define int ll
const int N = 2e6+10,mod = 998244353;
int n,m;

// p1
// p2 = p1 + a2
// p3 = p2 + a3

struct node {
    ll a[3][3] = {
        {1,1,0},
        {0,1,1},
        {0,1,0}
    };
    node operator* (node b) {
        node x;
        ms(x.a,0);
        fo(i,0,2) {
            fo(j,0,2) {
                fo(k,0,2) {
                    x.a[i][j] = x.a[i][j] % mod + this->a[i][k] * b.a[k][j] % mod;
                }
            }
        }
        return x;
    }
};

node qmi(node a,ll ans) {
    if(ans == 1) {
        return a;
    }
    ans -- ;
    node res;
    while(ans ) {
        if(ans & 1) res  = res * a;
        a = a * a;
        ans >>= 1;
    }
    return res;
}

void solve()
{
    cin>>n;
    if(n == 1 || n == 2 || n == 0) {
        cout<<1 + n<<endl;
        rt;
    }
    node x;
    x = qmi(x,n);
    node f;
    ms(f.a,0);
    f.a[0][0] = 1;
    f.a[1][0] = 1;
    f.a[2][0] = 1;
    f =  x* f;
    ll fin = f.a[0][0] % mod;
    cout<<fin<<endl;
}

signed main(){
    clapping();TLE;
gg
//    int t;cin>>t;while(t -- )
    solve();
//    {solve(); }
    return 0;
}

/*样例区


*/

//------------------------------------------------------------

 

posted @ 2022-07-31 13:54  er007  阅读(27)  评论(0)    收藏  举报