1122 机器人走方格 V4

来源:互联网 发布:微信营销系统源码 编辑:程序博客网 时间:2024/05/22 12:09

1122 机器人走方格 V4

基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

四个机器人a b c d,在2 * 2的方格里,一开始四个机器人分别站在4个格子上,每一步机器人可以往临近的一个格子移动或留在原地(同一个格子可以有多个机器人停留),经过n步后有多少种不同的走法,使得每个毯子上都有1机器人停留。由于方法数量巨大,输出 Mod 10^9 + 7的结果。

Input

输入1个数N(0 <= N <= 10^9)

Output

输出走法的数量 Mod 10^9 + 7

Input示例

1

Output示例

9
这题标题给的组合数学,但是我这题不会用卢卡斯写了,万能的卢卡斯到这GG了。
我写的是矩阵快速幂+全排列。
不废话了,直接上代码。

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;#define ll long long const int mod=1e9+7;int x[4]={0,1,2,3};struct maxn{    ll m[4][4];}A,B;ll a,b;maxn juzhen(maxn a,maxn b){    maxn c;    int i,j,k;    for(i=0;i<4;i++){        for(j=0;j<4;j++){            c.m[i][j]=0;            for(k=0;k<4;k++){                c.m[i][j]+=(a.m[i][k]*b.m[k][j]);                c.m[i][j]%=mod;            }        }    }    return c;}void quickm(ll n){    memset(B.m,0,sizeof(B.m));    for(int i=0;i<4;i++)    B.m[i][i]=1;    for(int i=0;i<4;i++){        for(int j=0;j<4;j++)        A.m[i][j]=1;    }    A.m[0][3]=A.m[1][2]=A.m[2][1]=A.m[3][0]=0;    while(n){        if(n&1)        B=juzhen(B,A);        A=juzhen(A,A);        n=n>>1;    }    ll ans=0;    do    {        ll tmp=1;        for(int i=0;i<4;i++)        {            tmp*=B.m[i][x[i]];            tmp%=mod;        }        ans+=tmp;        ans%=mod;    }while(next_permutation(x,x+4));    printf("%lld\n",ans);}int main(){    ll n;    scanf("%lld",&n);    quickm(n);    return 0;}

QAQ。

0 0