1122 机器人走方格 V4
输入1个数N(0 <= N <= 10^9)
输出走法的数量 Mod 10^9 + 7
1
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的更多相关文章
- 51nod 1122 机器人走方格 V4 【矩阵快速幂】
首先建立矩阵,给每个格子编号,然后在4*4的格子中把能一步走到的格子置为1,然后乘n次即可,这里要用到矩阵快速幂 #include<iostream> #include<cstdio ...
- 51nod 1122:机器人走方格 V4 (矩阵快速幂)
题目链接 昨天上随机信号分析讲马氏链的时候突然想到这题的解法,今天写一下 定义矩阵A,Ans=A^n,令A[i][j]表示,经过1次变换后,第i个位置上的机器人位于第j个位置的情况数,则Ans[i][ ...
- 51nod1122 机器人走方格 V4
矩阵快速幂求出每个点走n步后到某个点的方案数.然后暴力枚举即可 #include<cstdio> #include<cstring> #include<cctype> ...
- 51nod_1122:机器人走方格 V4 (矩阵快速幂)
题目链接 昨天上随机信号分析讲马氏链的时候突然想到这题的解法,今天写一下 定义矩阵A,Ans=A^n,令A[i][j]表示,经过1次变换后,第i个位置上的机器人位于第j个位置的情况数,则Ans[i][ ...
- 机器人走方格 V3
1120 . 机器人走方格 V3 基准时间限制:1 秒 空间限制:65536 KB 分值: 160 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在 ...
- 51nod1120 机器人走方格 V3
跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了.那么就是卡特兰数了.然后由于n和m太大所以用了lucas定理 //跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了 ...
- 51nod1119 机器人走方格 V2
终于学到了求组合数的正确姿势 //C(n+m-2,m-1) #include<cstdio> #include<cstring> #include<cctype> ...
- 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...
- 1119 机器人走方格 V2(组合)
1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于 ...
随机推荐
- 关于vim复制剪贴粘贴命令的总结-转
最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删除): 剪切其实也就顺带删除了所选择的 ...
- mvc中常见的属性验证
客户端验证逻辑会对用户向表单输入的数据给出一个即时反馈.而之所以需要服务器端验证,是因为来自网络的信息都是不能被信任的. 当在ASP.NET MVC设计模式上下文中谈论验证时,主要关注的是验证模型的值 ...
- C# CheckBoxList-DropDownList回显、筛选回显
<asp:CheckBoxList ID="ddlType" runat="server" RepeatColumns="10" Re ...
- 26. Linux GIT
windows git 下载链接: Msysgit https://git-scm.com/download/win 1 进入git bash进行第一次配置 git config --global ...
- OC Swift 走马灯效果
我们常见走马灯样式的功能,下面整理一下 Object-C 与 Swift 的实现代码 OC UILabel *label3 = [[UILabel alloc] initWithFrame:CGRec ...
- Rest使用get还是post
1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...
- Linux基础命令---mysqlshow显示数据库
mysqlshow mysqlshow是一个客户端的程序,它可以显示数据库的信息.表信息.字段信息. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 ...
- SpringMVC(2):JSON
一,JSON 介绍 JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效 ...
- 安装本地jar包到仓库
1. 下载并解压 sdk 包本地文件夹下 2. 进入项目目录 执行以下操作之前,先确定 maven 的 settings 文件中 配置的 仓库地址是否为本项目的 仓库地址,如果不是,则会安装到其他仓库 ...
- Spring boot 数据源配置。
配置文件 : spring boot 配置文件 有两种形式 ,一种是properties文件.一种是yml文件.案列使用properties文件. 数据源的默认配置 : spring boot 约定 ...