博客
关于我
sdnu1085.爬楼梯再加强版(矩阵快速幂)
阅读量:273 次
发布时间:2019-03-01

本文共 1337 字,大约阅读时间需要 4 分钟。

Description

WZ是个蛋痛的人,总是喜欢琢磨蛋痛的事,比如他最近想知道上楼梯总共有多少种方式。已知他一步可以迈一阶、两阶或者三阶,现在给你楼梯的阶数,让你计算总共有多少种方式。

Input

输入有多组数据,每组数据占一行,表示楼梯的阶数。(1<=N<=100,000,000,000)

Output

对于每组数据,输出一行,表示上楼方式的总数 % 1000000007。

Sample Input

12

Sample Output

12

矩阵快速幂 

#include
using namespace std;typedef long long ll;const int N=3;const int MOD=1000000007;struct mat{ ll a[N][N];};mat mat_mul(mat x,mat y){ mat res; memset(res.a,0,sizeof(res.a)); for(int i=0; i<3; i++) for(int j=0; j<3; j++) for(int k=0; k<3; k++) res.a[i][j]=(res.a[i][j]+(x.a[i][k]*y.a[k][j])%MOD)%MOD; return res;}long long mat_pow(ll n){ mat c,res; memset(c.a,0,sizeof(c.a)); c.a[0][0]=c.a[0][1]=c.a[0][2]=1; c.a[1][0]=1; c.a[2][1]=1; memset(res.a,0,sizeof(res.a)); for(int i=0; i<3; i++) res.a[i][i]=1; while(n) { if(n&1) res=mat_mul(res,c); c=mat_mul(c,c); n=n>>1; } return ((4*res.a[0][0])%MOD+(2*res.a[0][1])%MOD+res.a[0][2]%MOD)%MOD;///4 2 1分别是前三项}int main(){ long long n; while(scanf("%lld",&n)!=EOF) { if(n==1) cout<<1<<'\n'; else if(n==2) cout<<2<<'\n'; else if(n==3) cout<<4<<'\n'; else { long long ans=mat_pow(n-3); cout<
<<'\n'; } } return 0;}

 

转载地址:http://usio.baihongyu.com/

你可能感兴趣的文章
Mysql模糊查询like效率,以及更高效的写法
查看>>
MySQL死锁套路:一次诡异的批量插入死锁问题分析
查看>>
Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction
查看>>
mysql每个数据库的最大连接数_MySQL数据库最大连接数
查看>>
Mysql流程控制结构,if函数、case结构、if结构、循环结构
查看>>
mysql添加外网访问权限
查看>>
mysql添加用户
查看>>
MySQL添加用户、删除用户与授权
查看>>
mysql添加用户及权限
查看>>
Mysql添加用户并授予只能查询权限
查看>>
mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决
查看>>
mysql添加索引
查看>>
mysql添加表注释、字段注释、查看与修改注释
查看>>
mysql清理undo线程_MySQL后台线程的清理工作
查看>>
mysql清空带外键的表
查看>>
MySQL清空表数据
查看>>
mysql源码安装
查看>>
Mysql源码安装过程中可能碰到的问题
查看>>
MySQL灵魂16问,你能撑到第几问?
查看>>
MySQL灵魂拷问:36题带你面试通关
查看>>