码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1122 机器人走方格 V4 【矩阵快速幂】

时间:2018-01-23 20:38:13      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:cst   pac   scan   ons   机器   编号   std   include   space   

首先建立矩阵,给每个格子编号,然后在4*4的格子中把能一步走到的格子置为1,然后乘n次即可,这里要用到矩阵快速幂

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=1e9+7;
long long n,ans;
struct qwe
{
    long long a[5][5];
    qwe operator * (qwe b)
    {
        qwe c;
        for(long long i=1;i<=4;i++)
            for(long long j=1;j<=4;j++)
                c.a[i][j]=0;
        for(long long k=1;k<=4;k++)
            for(long long i=1;i<=4;i++)
                for(long long j=1;j<=4;j++)
                    c.a[i][j]=(c.a[i][j]+a[i][k]*b.a[k][j])%mod;
        return c;
    }
}a,r;
int main()
{
    scanf("%lld",&n);
    for(long long i=1;i<=4;i++)
        for(long long j=1;j<=4;j++)
            a.a[i][j]=1;
    a.a[1][4]=0,a.a[2][3]=0,a.a[3][2]=0,a.a[4][1]=0;
    for(long long i=1;i<=4;i++)
        r.a[i][i]=1;
    while(n)
    {
        if(n&1)
            r=r*a;
        a=a*a;
        n>>=1;
    }
    for(long long i1=1;i1<=4;i1++)
        for(long long i2=1;i2<=4;i2++)
            if(i2!=i1)
                for(long long i3=1;i3<=4;i3++)
                    if(i3!=i1&&i3!=i2)
                        for(long long i4=1;i4<=4;i4++)
                            if(i4!=i1&&i4!=i2&&i4!=i3)
                                ans=(ans+r.a[1][i1]*r.a[2][i2]%mod*r.a[3][i3]%mod*r.a[4][i4]%mod)%mod;
    printf("%lld\n",ans);
    return 0;
}

51nod 1122 机器人走方格 V4 【矩阵快速幂】

标签:cst   pac   scan   ons   机器   编号   std   include   space   

原文地址:https://www.cnblogs.com/lokiii/p/8337183.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!