zoukankan      html  css  js  c++  java
  • 51nod1122 机器人走方格V4

    题目看这里

    看一看知道可以dp

    设f[i][s1][s2][s3][s4]表示走了i步,每个机器人分别在哪个格子里

    用矩阵优化

    但是发现状态数过于巨大,会TLE

    考虑设f[i][j][k]表示走了i步,从j格子走到k格子的方案数

    那么显然f[i]=T^i 其中T是全1矩阵减掉单位矩阵

    那么可以快速幂求出f

    接下来枚举4的全排列g,表示第i个机器人走到g[i]

    答案就是∑∏f[i][g[i]]

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define M 1000000007
    #define LL long long
    using namespace std;
    struct Mat{
        int s[4][4];
        inline Mat operator* (Mat b){
            Mat c; memset(&c,0,sizeof c);
            for(int i=0;i<4;++i)
                for(int j=0;j<4;++j)
                    for(int k=0;k<4;++k)
                        c.s[i][j]=(c.s[i][j]+(LL)s[i][k]*b.s[k][j])%M;
            return c;
        }
    } a,b; 
    int n; LL ans=0;
    inline void cal(int t[4]){
        LL k=1;
        for(int i=0;i<4;++i)
            k=k*b.s[i][t[i]]%M;
        ans=(ans+k)%M;
    }
    int main(){
        for(int i=0;i<4;++i) for(int j=0;j<4;++j) b.s[i][j]=!(a.s[i][j]=(i!=j));
        scanf("%d",&n);
        for(;n;a=a*a,n>>=1) 
            n&1?b=b*a:a;
        int t[4]={0,1,2,3};
        do cal(t); while(next_permutation(t,t+4));
        printf("%lld
    ",ans);
    }

  • 相关阅读:
    opengl打开本地bmp图片绘制
    jsp连接mysql数据库
    opengl雾开启
    opengl多重采样
    抗锯齿说
    opengl混合效果
    android实现视频图片取缩略图
    opengl Test
    动态规划算法(@背包问题)
    百钱买百鸡的问题(递归解法)
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477099.html
Copyright © 2011-2022 走看看