题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6185

  题目描述: 一个4*n的矩形, 你用1*2的矩形覆盖有多少种方案, n <= 1e18

  解题思路: 自己看题一开始以为是轮廓线DP, 后来发现n实在是太大了....数组根本开不下, 后来觉得应该是一个矩阵快速幂, 可是递推式自己求不出来。 其实递推式应该打表出前十个n再去求, 因为我们这是一个线性递推式

    f(n) = k1 * f(n-1) + k2 * f(n-2) + ......  kw * f(n-w)

  我们从f(n-1) + f(n-2) 开始去找, 如果找到的k都是整数的话, 那这个递推式就是正确的, 因为这个递推式的几何意义表示在完成f(n-w)的前提下 前面那些有多少种方案, 而方案数一定是整数, 所以保证了正确性........现在我们先借助求得的前十个答案来求k, 当w = 2 , 3的情况下k都存在小数, 当w = 4的时候全部是整数

  代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define sca(x) scanf("%d",&x)
#define de printf("=======\n")
typedef long long ll;
using namespace std;const int maxn = 105;
typedef double Matrix[maxn][maxn];
Matrix A, X;void gauss(Matrix A,int n)
{int i,j,k,r;for(int i=0; i<n; i++){r=i;for( j=i+1; j<n; j++)if(fabs(A[j][i])>fabs(A[r][i]))r=j;if(r!=i)for(j=0; j<=n; j++)swap(A[r][j],A[i][j]);for(k=i+1; k<n; k++){double f=A[k][i]/A[i][i];for(j=i; j<=n; j++)A[k][j]-=f*A[i][j];}}for(i=n-1; i>=0; i--){for(j=i+1; j<n; j++)A[i][n]-=A[j][n]*A[i][j];A[i][n]/=A[i][i];}
}int main() {mem0(A);A[0][0]=95,A[0][1]=36,A[0][2]=11,A[0][3]=5,A[1][0]=6336,A[1][1]=2245,A[1][2]=781;A[1][3]=281,A[2][0]=781,A[2][1]=281,A[2][2]=95,A[2][3]=36,A[3][0]=2245,A[3][1]=781;A[3][2]=281,A[3][3]=95,A[0][4]=281,A[1][4]=18061,A[2][4]=2245,A[3][4]=6336;gauss(A, 4);for( int i = 0; i < 4; i++ ) {cout << A[i][4] << endl;}return 0;
}

求矩阵快速幂的系数

  系数是1, 5, 1, -1, 所以递推式就是f(n) = f(n-1)+5f(n-2)+f(n-3)-f(n-4)

  这时候我们就可以根据这个求矩阵快速幂的矩阵了...........

  写了一个多点儿......又出现BUG了.....不容易啊....

  代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define sca(x) scanf("%d",&x)
#define de printf("=======\n")
typedef long long ll;
using namespace std;const ll mod = 1e9+7;
const int maxn = 4;
const int temp = 4;
const int a[4] = {36,11,5,1};
typedef struct {ll mat[maxn][maxn];void init() {mem0(mat);for( int i = 0; i < temp; i++ ) {for( int j = 0; j < temp; j++ ) {if( i == j ) mat[i][j] = 1;}}}
} Matrix;Matrix matrix = {1,5,1,-1,1,0,0,0,0,1,0,0,0,0,1,0};Matrix mul( Matrix m1, Matrix m2 ) {Matrix ret;mem0(ret.mat);for( int i = 0; i < temp; i++ ) {for( int j = 0; j < temp; j++ ) {for( int k = 0; k < temp; k++ ) {ret.mat[i][j] = (ret.mat[i][j] + (m1.mat[i][k]*m2.mat[k][j])+mod) % mod;//                cout << ret.mat[i][j] << endl;
            }}}return ret;
}Matrix matrix_quick_power( Matrix m, ll times ) {Matrix ret;ret.init();while( times ) {if( times & 1 ) ret = mul( ret, m );times >>= 1;m = mul(m, m);}return ret;
}int main() {//    debug(matrix);//    debug(matrix_quick_power( matrix, 1));
    ll n;while( cin >> n ) {if( n == 1 ) {cout << 1 << endl;}else if( n == 2 ) {cout << 5 << endl;}else if( n == 3 ) {cout << 11 << endl;}else if( n == 4 ) {cout << 36 << endl;}else {Matrix res;res.init();res = matrix_quick_power(matrix, n-4);ll ans = 0;for( int i = 0; i < 4; i++ ) {ans = (ans + res.mat[0][i]*a[i] + mod) % mod;}cout << ans << endl;}}return 0;
}

矩阵快速幂

  思考: 这里明确一个问题, 我看到其他博客里会有这样的写法, typedef double Matrix[4][4], 这里解释一样, 这个时候Matrix 代表的就是一个4*4的整型数组, Matrix A , A就是那个数组, 但是和二维数组不一样的是, 这里的A可以传进函数里做实参, 但是为什么呢?, 然后我看到函数声明是这样显示的 double (*A)[], 这样就能作为实参传进去了吗........我还是很弱, 得多学点儿......真的菜................||分割 分割 分割||  刚才学长在群里说了一下想明白了......原来传的就是一个指针........如果想传实参的话用vector<vector<double>>就可以了.....OK, 过

转载于:https://www.cnblogs.com/FriskyPuppy/p/7462848.html

HDU 6185 Covering 矩阵快速幂 递推相关推荐

  1. hdu 6185 Covering 矩阵快速幂

    题意: 用1*2和2*1的两种地毯铺地 问有多少种情况 思路: 直接推转移方程 从An-1的地方只有1种转移方法 从An-2的地方有5种转移方法 n-3转移不到n 但是n-4可以 也是最复杂的 从An ...

  2. 矩阵快速幂递推(五行)

    矩阵快速幂 第一次写博客,想着写哪个知识点呢..来想着还是写我第一个理解了的并且在比赛中成功写出来的(orz)矩阵快速幂. 快速幂 首先快速幂先来复习一下 所谓快速幂,就是加快幂运算的算法. 主要公式 ...

  3. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)

    题目链接:点击查看 题目大意:给出函数f(x): 现给出n,a,b,c,mod,求f(n)对mod取模后的结果 题目分析:这个题目相对于前几个题来说稍微加大了点难度,但还是挺水的一个题,首先我们可以对 ...

  4. hdu 6395Sequence【矩阵快速幂】【分块】

    Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  5. HDU 2256(矩阵快速幂)

    传送门 题面: Problem of Precision Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  6. HDU 4382 【矩阵快速幂】【欧拉降幂】

     自己的思路写的 102 × 102 大小的转化矩阵,好在线代学的还行想到用矩阵分块乘法过了- 看其他人的题解用的 3 × 3  构造一个 转化矩阵 T T T ,一个用来存储结果的 P P P  先 ...

  7. 20181023(模拟+矩阵快速幂及推公式+最短路+不知道什么DP)

    NOIP欢乐%你赛 1. 小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力 ...

  8. UVA 10870 Recurrences 矩阵快速幂

    题意:给你递推公式要求矩阵快速幂的第n项 解题思路: 经典的矩阵快速幂递推第n项目做法. 解题代码: 1 // File Name: temp.cpp 2 // Author: darkdream 3 ...

  9. Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS

    文章目录 题意 题解 对数法转指数线性递推 原根与模意义下求对数 拔山盖世! 最终步骤 Problem Origin 狠搞了一个多星期,做出来之后仍然一知半解,写个博客重理思路. 题意 定义序列fff ...

最新文章

  1. [云炬python3玩转机器学习] 5-3简单线性回归的实现
  2. 南通工学院计算机97级,2021年南通理工学院录取结果查询网址入口及录取结果公布时间...
  3. Eclipse Validating减少不必要的验证
  4. SparkSQL性能优化
  5. C语言 #pragma once - C语言零基础入门教程
  6. 如何循序渐进向DotNet架构师发展(转,写的不错)
  7. 更改手机或者电视的hosts文件
  8. 安装脚本实现百度云播放视频加速
  9. Python sorted函数|sorted([13,1,237,89,100],key=lambda x:len(str(x)))
  10. fastnest怎么一键排版_我的妈呀!一键排版也太好用了吧!3秒钟搞定排版!
  11. x-data-spreadsheet 在线编辑excel文件,支持导入/导出/上传/读取网络 excel,合并单元格(vue版本)
  12. DDR controller控制器之AXI接口模块设计
  13. 你知道哪些或者你们线上使用什么GC策略? 它有什么优势,适用于什么场景?
  14. iphone12mini是双卡双待吗
  15. java中 exe是什么文件_从文件位置运行Java中的.exe文件
  16. 二阶线性微分方程解的结构(齐次与非齐次)+ 常数变易法 | 高阶微分方程(二)
  17. C++:建立Cylinder类,有三个double型私有数据成员:半径、高和体积,构造函数传递两个值:半径和高,计算体积。成员函数showVolume()用来显示每个对象的体积。
  18. H3C防火墙端口开启二层模式,网络不通的解决方法
  19. iframe视频代码_在Excel中创建IFRAME代码
  20. 连续傅里叶变换和离散傅里叶变换的关系

热门文章

  1. Python算法题----求出和为S的所有连续正整数数列
  2. ASP.NET缓存 Cache之数据缓存
  3. keras中的fit函数参数_keras的fit_generator与callback函数
  4. 常见linux网络端口对照表(excel),常见子网掩码对照表Excel下载(反、正掩码)-数通工程师的傍身笔记...
  5. 服务器收到消息怎么推送给app_「刹那问答24」浅谈FCM推送
  6. 电脑如何格式化_分别手把手教你在Windows和mac上格式化磁盘
  7. 模拟请求分页管理中地址转换和缺页中断处理_Linux内存管理:缺页异常(一)
  8. 计算机网络控制系统,计算机网络远程控制系统的应用研究(原稿)
  9. [python教程入门学习]Python标准库映射类型与可散列数据类型的关系
  10. python程序员总结的一些基本语法