hihocoder 1143 : 骨牌覆盖问题·一

来源:互联网 发布:国家统计局数据 编辑:程序博客网 时间:2024/05/17 07:28

点击打开链接

描述

骨牌,一种古老的玩具。今天我们要研究的是骨牌的覆盖问题:
我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘。对于这个棋盘,一共有多少种不同的覆盖方法呢?
举个例子,对于长度为1到3的棋盘,我们有下面几种覆盖方式:

提示:骨牌覆盖

提示:如何快速计算结果

输入

第1行:1个整数N。表示棋盘长度。1≤N≤100,000,000

输出

第1行:1个整数,表示覆盖方案数 MOD 19999997

样例输入
62247088
样例输出
17748018
#include<stdio.h>#include<stdlib.h>#include<iostream>#include<math.h>#include<vector>#include<string>#include<sstream>#include<algorithm>#include<stack>#include<queue>#include<limits.h>#include<numeric>#include<cstring>#include<map>using namespace std;#define eps 1e-8#define LL long longconst LL mod=19999997;const int MIN= -1e3;const int MAX= 1e3;const int MAX_N = 1e5 + 10;const int MAX_M = 1e5 + 10;const int MAX_K = 1e4+10;static LL N, M, K, T;struct matrlc {LL mapp[2][2];}ans, base;matrlc unit = {1, 0, 0, 1};matrlc mult(matrlc a, matrlc b){matrlc c;for(int i=0; i<2; ++i){for(int j=0; j<2; ++j){c.mapp[i][j] = 0;for(int k=0; k<2; ++k){c.mapp[i][j] = (c.mapp[i][j] + (a.mapp[i][k] * b.mapp[k][j])%mod) %mod;}c.mapp[i][j] %=mod;}}return c;}LL pow(LL n){base.mapp[1][1] = 0;base.mapp[0][0] = base.mapp[1][0] = base.mapp[0][1] = 1;ans.mapp[0][0] = ans.mapp[1][1] = 1;ans.mapp[1][0] =ans.mapp[0][1] =0;while(n){if(n&1) {ans =mult(ans, base);}base = mult(base, base);n>>=1;}return ans.mapp[0][1]%mod;}int main () {scanf("%lld", &N);cout << pow(N+1) << endl;system("pause");return 0;}


0 1