SDNU 1085 爬楼梯再加强版(矩阵快速幂)

/*少说话,多做事*/
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
//#include<bits/stdc++.h>
//ios::sync_with_stdio(0);
//cin.tie(0);
//cout.tie(0);
typedef long long ll;

using namespace std;

/*

 */

const int maxn = 3;
const ll mod=1e9+7;

struct node
{
    ll m[maxn][maxn];
}unit;

void init() //初始化 ,将unit设为单位数组
{
    for(int i=0;i<maxn;i++)
    {
        for (int j=0;j<maxn;j++)
        {
            if(i==j) unit.m[i][j]=1;
            else unit.m[i][j]=0;
        }
    }
}

node matmul(node a,node b)  //定义矩阵的乘法  -> 矩阵乘以矩阵,返回的是矩阵
{
    node ans;
    ll tmp =0;
    for(int i=0;i<maxn;i++)
    {
        for(int j=0;j<maxn;j++)
        {
            tmp=0;
            for(int k=0;k<maxn;k++)
            {
                tmp=(tmp + a.m[i][k] * b.m[k][j])%mod;
            }
            ans.m[i][j]=tmp;
        }
    }
    return ans;
}

node qaq (node x , ll n) //计算数组^b, --》比如设A为数组,B为一个数,则qaq求的是A^B
{
    init();  //将unit初始化为单位矩阵 ,一开始都是从单位矩阵开始乘的。 -》 就一直按照unit变化,最后得出的答案就是从unit中找,这道题是m[1][0]为fn
    while(n!=0)
    {
        if(n%2==1) //如果b是奇数
        {
            unit = matmul(unit, x); //ans是矩阵,unit也是矩阵
        }
        x = matmul(x, x);
        n>>=1;
    }
    return unit;
}

int main()
{
    ll n;
    while(cin >> n)
    {
        if(n==1) cout << "1" << endl;
        else if(n==2) cout << "2" << endl;
        else if(n==3) cout << "4" << endl;
        else
        {
            node x = {1,1,1,1,0,0,0,1,0};
            x = qaq(x, n-3);
            cout << (x.m[0][0]*4%mod + x.m[0][1]*2%mod + x.m[0][2]*1%mod)%mod << endl;
        }
    }
    return 0;
}
全部评论

相关推荐

#简历#先说一说我自己的想法,很多人都很排斥苍穹外卖,认为没什么技术点和含金量,但实际上我觉得恰恰相反,苍穹外卖虽然代码本身并不是你自身能力的证明,但是是作为一个新人学习时很好的跳板和原始框架,在这个框架上进行的改进可以很好的辐射到你自己的个人成果上,并作为你和面试官聊天的筹码大多数人的苍穹外卖只写增删改查,千篇一律,吸引不了面试官,所以这才让大家误以为只要是苍穹外卖就不要写进简历里这种误区,但实际上如果你在原有的层面上进行改进,并作为你的项目亮点和面试官介绍,告诉他你的苍穹外卖和别人的有什么不同,增加了哪些技术难点,这才显得你是完全自己理解了这个项目,并且有自己动手实践项目的能力,而不是就看了个课程就以为自己会了,就当成自己的了,如此一来,这反而成为你的加分项苍穹外卖为什么看的人最多,说明它好啊,如果它不好,为什么看的人还这么多,想清楚这个逻辑,我觉得要做的最重要的事,就是如何在原有框架上进行改进提效,比起听其他人的话重新搞一个项目性价比高得多,而且我亲测项目并没有成为我找到工作的阻碍,我投的大厂一大半都给我面试了,而且很多不止一个部门,退一万步说,当你手头没有其他项目的时候,有苍穹外卖总比什么都没有的好很多,不需要因为苍穹外卖有任何心理负担关于简历的任何部分都欢迎大家提意见,十分感谢大家,祝大家找实习+秋招顺利上岸,offer拿到手软#简历中的项目经历要怎么写##我的上岸简历长这样##最后再改一次简历##简历##简历被挂麻了,求建议#
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务