基准时间限制:1 秒 空间限制:131072 KB 
四个机器人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
思路:矩阵快速幂。
这道题和hdu2232是一样的只不过hud的那到题数据比较小,用dp能过,但这道题必须要矩阵快速幂。这道题的思路可以参考http://blog.csdn.net/womendeaiwoming/article/details/5806700
给出递推:

其中f下标表示第i个机器人在第j的方格的方案;

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<queue>
6 #include<string.h>
7 using namespace std;
8 typedef long long LL;
9 typedef struct node {
10 LL m[4][4];
11 node() {
12 memset(m,0,sizeof(m));
13 }
14 } maxtr;
15 void Init(maxtr *p);
16 maxtr quick(maxtr ans,LL m);
17 const LL mod = 1e9 + 7;
18 LL dp[4][4];
19 LL dpx[4][4];
20 int main(void) {
21 LL n;
22 scanf("%lld",&n);
23 if(n == 0) {
24 printf("1\n");
25 } else {
26 maxtr ac;
27 Init(&ac);
28 int i,j,z;
29 maxtr ak = quick(ac,n);
30 memset(dpx,0,sizeof(dpx));
31 for(i = 0; i < 4; i++) {
32 for(j = 0; j < 4; j++) {
33 for(z = 0; z < 4; z++) {
34 dpx[i][j] = dpx[i][j] + ak.m[i][z]*dp[z][j]%mod;
35 dpx[i][j]%=mod;
36 }
37 }
38 }
39 int x,y;
40 LL sum = 0;
41 for(i = 0; i < 4; i++) {
42 for(j = 0; j < 4; j++) {
43 for(x = 0; x < 4; x++) {
44 for(y = 0; y < 4; y++) {
45 if(i==j||i==x||i==y||j==x||j==y||x==y)
46 continue;
47 else {
48 sum = sum + (((dpx[0][i]*dpx[1][j]%mod)*dpx[2][x]%mod)*dpx[3][y])%mod;
49 sum %= mod;
50 }
51 }
52 }
53 }
54 }
55 printf("%lld\n",sum);
56 }
57 return 0;
58 }
59 maxtr E() {
60 int i,j;
61 maxtr ans;
62 for(i = 0 ; i < 4 ; i++) {
63 for(j = 0 ; j < 4 ; j++) {
64 if(i == j) {
65 ans.m[i][j] = 1;
66 }
67 }
68 }
69 return ans;
70 }
71 void Init(maxtr *p) {
72 int i,j;
73 for(i = 0; i < 4; i++) {
74 fill(p->m[i],p->m[i]+4,1);
75 }
76 p->m[0][2] = 0;
77 p->m[1][3] = 0;
78 p->m[2][0] = 0;
79 p->m[3][1] = 0;
80 memset(dp,0,sizeof(dp));
81 for(i = 0; i < 4; i++) {
82 for(j = 0; j < 4; j++) {
83 if(i == j)
84 dp[i][j] = 1;
85 }
86 }
87 }
88 maxtr quick(maxtr ans,LL m) {
89 int i,j,z;
90 maxtr ask = E();
91 while(m) {
92 if(m&1) {
93 maxtr C;
94 for(i = 0; i < 4; i++) {
95 for(j = 0 ; j < 4; j++) {
96 for(z = 0; z < 4; z++) {
97 C.m[i][j] = C.m[i][j] + ans.m[i][z]*ask.m[z][j]%mod;
98 C.m[i][j]%=mod;
99 }
100 }
101 }
102 ask = C;
103 }
104 maxtr ak;
105 for(i = 0 ; i < 4; i++) {
106 for(j = 0; j < 4; j++) {
107 for(z = 0 ; z < 4; z++) {
108 ak.m[i][j] = ak.m[i][j] + ans.m[i][z]*ans.m[z][j]%mod;
109 ak.m[i][j]%=mod;
110 }
111 }
112 }
113 ans = ak;
114 m>>=1;
115 }
116 return ask;
117 }



1122 机器人走方格 V4的更多相关文章

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

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

  2. 51nod 1122:机器人走方格 V4 (矩阵快速幂)

    题目链接 昨天上随机信号分析讲马氏链的时候突然想到这题的解法,今天写一下 定义矩阵A,Ans=A^n,令A[i][j]表示,经过1次变换后,第i个位置上的机器人位于第j个位置的情况数,则Ans[i][ ...

  3. 51nod1122 机器人走方格 V4

    矩阵快速幂求出每个点走n步后到某个点的方案数.然后暴力枚举即可 #include<cstdio> #include<cstring> #include<cctype> ...

  4. 51nod_1122:机器人走方格 V4 (矩阵快速幂)

    题目链接 昨天上随机信号分析讲马氏链的时候突然想到这题的解法,今天写一下 定义矩阵A,Ans=A^n,令A[i][j]表示,经过1次变换后,第i个位置上的机器人位于第j个位置的情况数,则Ans[i][ ...

  5. 机器人走方格 V3

    1120 . 机器人走方格 V3   基准时间限制:1 秒 空间限制:65536 KB 分值: 160 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在 ...

  6. 51nod1120 机器人走方格 V3

    跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了.那么就是卡特兰数了.然后由于n和m太大所以用了lucas定理 //跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了 ...

  7. 51nod1119 机器人走方格 V2

    终于学到了求组合数的正确姿势 //C(n+m-2,m-1) #include<cstdio> #include<cstring> #include<cctype> ...

  8. 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

    51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...

  9. 1119 机器人走方格 V2(组合)

    1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于 ...

随机推荐

  1. lua_newthread的真正意义

    lua_newthread 这个接口,存在误导性,很多人第一次试图用它来解决多线程问题时,都会入坑. 实际上,这个接口真正的用法,是给那些在lua更底层的某些行为(通常是递归)导致了lua的栈溢出而准 ...

  2. jmeter+ant输出测试报告

    jmeter自己本身可以输出html测试报告的,不过这种自带的测试报告特别简陋,如下图所示,一般我们是不看这种的. 我们可以使用ant来输出更高效.更直观的测试报告. 首先下载安装ant, 我用的是a ...

  3. day20 系统优化

    day20 系统优化 yum源的优化 yum源的优化: 自建yum仓库 使用一个较为稳定的仓库 # 安装华为的Base源 或者使用清华的源也可以 wget -O /etc/yum.repos.d/Ce ...

  4. 【Android】No Android SDK found(mac)+ 真机调试

     [1]No Android SDK found 如果没下载SDK,可以去google官方下载 如果因为上网问题,这里提供两个网址,有人整理好了,这里先谢谢他们,下面两个择其一下载 http://to ...

  5. zabbix之被动模式之编译安装proxy

    #:准备源码包,编译安装 root@ubuntu:/usr/local/src# ls zabbix-4.0.12.tar.gz root@ubuntu:/usr/local/src# tar xf ...

  6. Linux:$?,$n,$#,$0

    $? 获取执行上一个指令的返回值(0为成功,非零为失败) $n 获取当前执行的shell脚本的第n个参数值,n=1...9,当n=0的时表示脚本的文件名,如果n大于9,大括号括起来${10} $# 获 ...

  7. java中子类继承父类什么?

    1.继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包: 2.继承默认权限修饰符修饰的属性和方法,前提是子类和父类在同一个包.

  8. 自动执行Python脚本

    一.自动执行Python脚本(前提条件是电脑已安装对应的Python程序) 1.1.win+R-输入cmd在输入where python查看Python的安装位置 C:\Users\ASUS\AppD ...

  9. 果蝇优化算法_Fruit Fly Optimization

    1. 果蝇优化算法背景 在夏天,果蝇是一种随处可见的昆虫.果蝇在嗅觉和视觉特别突出.腐烂的食物发出一种刺鼻的味道,温度越高这种气味的扩散速度较快,果蝇对这种味道非常敏感.腐烂的味道和食物的位置有关.一 ...

  10. Sentry 开发者贡献指南 - 前端 React Hooks 与虫洞状态管理模式

    系列 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS) 什么是虫洞状态管理模式? 您可以逃脱的最小 ...