C++——NOIP例题——坐标系

来源:互联网 发布:剑三捏脸数据 编辑:程序博客网 时间:2024/04/28 11:12

坐标系

题目描述

Tom 的梦境中出现了一个平面直角坐标系,自原点,向四方无限延伸。Tom 在坐标系的原点,他可以向上、向左或者向右走。他可以走 n 步,但不能经过相同的点。

Tom 想知道他有多少种走法。

输入格式

输入仅一行一个正整数 n ,表示 Tom 可以走的步数。

输出格式

输出共一行,输出一个正整数,表示答案(对 109+7 取模)。

样例数据 1

输入

2

输出

7

样例数据 2

输入

3

输出

17

备注

【样例1说明】
从 (0,0) 出发走 2 步,共 7 种走法:
(0,0)->(0,1)->(0,2)
(0,0)->(0,1)->(1,1)
(0,0)->(0,1)->(-1,1)
(0,0)->(1,0)->(2,0)
(0,0)->(1,0)->(1,1)
(0,0)->(-1,0)->(-2,0)
(0,0)->(-1,0)->(-1,1)

【数据规模与约定】

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <map>#include <queue>#include <algorithm>using namespace std;const long long mod=1e9+7;struct Matrix{long long a[3][3];inline void I(){memset(a,0,sizeof(a));for(int i=1;i<=2;i++)a[i][i]=1;}inline Matrix operator * (const Matrix &b){Matrix c;for(int i=1;i<=2;i++)for(int j=1;j<=2;j++){long long sum=0;for(int k=1;k<=2;k++)sum=(a[i][k]*b.a[k][j]+sum)%mod;c.a[i][j]=sum;}return c;}inline Matrix operator ^ (int x){Matrix res,tmp=*this;res.I();for(;x>0;x>>=1,tmp=tmp*tmp)if(x&1)res=res*tmp;return res;}}A,B;int n;int main(){//freopen("coordinate.in","r",stdin);//freopen("coordinate.out","w",stdout);scanf("%d",&n);A.a[2][1]=A.a[2][2]=B.a[1][1]=0;A.a[1][1]=A.a[1][2]=B.a[1][2]=B.a[2][1]=1;B.a[2][2]=2;A=A*(B^(n+1));cout<<A.a[1][1]%mod<<'\n';return 0;}


0 0
原创粉丝点击