HDU5950 矩阵快速幂(巧妙的递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950
题意:f[n] = 2*f[n-2] + f[n-1] + n^4
思路:对于递推题而言,如果递推n次很大,则考虑矩阵快速幂的方式推出递推式,计算出累乘的矩阵
本题递推式:本题的递推式子虽然已经给出,但是由于n^4的关系,直接是无法使用这个f[n] = 2*f[n-2] + f[n-1] + n^4递推完成矩阵的推导的,而是可以先处理一下,如下:
f[n] = 2*f[n-2] + f[n-1] + n^4
f[n+1] = 2*f[n-1] + f[n] + n^4 + 4*n^3 + 6*n^2 + 4*n + 1
f[n+2] = 2*f[n] + f[n+1] + (n+1)^4 + 4*(n+1)^3 + 6*(n+1)^2 + 4*(n+1)+ 1
此时,我们发现从n+1项开始包括n+1项,都是由7个部分组成的多项式,则我们可以利用n+1项和n+2项的多项式进行矩阵快速幂的递推矩阵的推导,由于矩阵乘法的性质,对于一个1X7的矩阵A,要求相乘另一个矩阵B之后,还是一个1X7的矩阵,则矩阵B的规模必须是7X7,下面是推导, 对于黄色的一行乘绿色一列,得到橙色的一个数
完成矩阵的递推之后,就很简单了,用矩阵的快速幂计算即可,需要注意的是对于n>=3,我们才需要进行矩阵相乘的运算,而初始的时候,我们需要计算出黄色矩阵代表的部分,本题就是将n==2代入,算出初始黄色矩阵为[a, b, 16, 8, 4, 2, 1]
代码:
#include<iostream>
#include<stdio.h>
using namespace std; const long long mod = ;
struct mat{
long long m[][];
}; mat operator * (mat a, mat b){ //重载乘号,同时将数据mod10000
mat ret;
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
long long temp = ;
for(int k = ; k < ; k++){
temp += a.m[i][k] * b.m[k][j];
temp %= mod;
}
ret.m[i][j] = temp;
}
}
return ret;
} mat pow_mat(int f1, int f2, mat a, int n){ //矩阵快速幂和快速幂相同(广义快速幂的思想)
mat res;
res.m[][] = f1,res.m[][] = f2,res.m[][] = ,res.m[][] = ,res.m[][] = ,res.m[][] = ,res.m[][] = ;
while(n){
if(n&) res = res * a;
a = a*a;
n >>= ;
}
return res;
} int main(){
int t;
scanf("%d", &t);
while(t--){
int n, a, b;
scanf("%d%d%d", &n, &a, &b);
if(n == ) printf("%d\n", a);
else if(n == ) printf("%d\n", b);
else{
mat x;
x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
mat ans = pow_mat(a, b, x, n-);
printf("%d\n", ans.m[][]);
}
}
return ;
}
HDU5950 矩阵快速幂(巧妙的递推)的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识
求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...
- 矩阵快速幂(queue递推)
http://acm.hdu.edu.cn/showproblem.php?pid=2604 Queuing Time Limit: 10000/5000 MS (Java/Others) Me ...
- 【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板
题目大意: F[0]=0 F[1]=1 F[n+2]=F[n+1]+F[n] 求F[n] mod 104. F[n+2] F[n+1] = 1 1 1 0 * F[n+1] F[n] 记这个矩阵为A, ...
- [HDOJ2604]Queuing(递推,矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n- ...
- 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)
Happy Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- POJ3070 斐波那契数列递推 矩阵快速幂模板题
题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...
- 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )
题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...
随机推荐
- MongoDB的查询索引
目录 为什么要建立索引? 索引的分类有哪些? _id索引 单键索引 多键索引 复合索引 过期索引 hello,今天是万圣节
- 从零开始入门 K8s | 可观测性:你的应用健康吗?
作者 | 莫源 阿里巴巴技术专家 一.需求来源 首先来看一下,整个需求的来源:当把应用迁移到 Kubernetes 之后,要如何去保障应用的健康与稳定呢?其实很简单,可以从两个方面来进行增强: 首先是 ...
- 写了那么多年 Java 代码,终于 debug 到 JVM 了
继上篇文章 原创 | 全网最新最简单的 openjdk13 代码编译 之后,我们有了自己编译后的 jdk 和 hotspot,如下图所示.接下来就来干一番事情. 搭建调试环境 1.下载 CLion 软 ...
- 你真的懂Spring Java Config 吗?Full @Configuration vs lite @Bean mode
Full @Configuration和lite @Bean mode 是 Spring Java Config 中两个非常有意思的概念. 先来看一下官方文档关于这两者的相关内容: The @Bean ...
- MySQL8身份验证问题解决
开新项目.使用MySQL8,在经历过B级别的网速下载后,终于安装好了MySQL,虽然在终端上是可以直接登录的. 但是我使用Navicat就无法访问了,提示什么登录失败,还有乱码. 搜索了一下,发现是M ...
- canvas实现平面迁徙图
前言 最近在做自己维护的一个可视化工具的时候,在添加基于echart的雷达图的时候,按照echart官网案例写完发现在自己项目中无法正常运行,排查了一番发现是我项目中echart的版本太低.找到问题原 ...
- Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行
本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...
- 2019头条java面试总结 (包含面试题解析)
2019滴滴java面试总结 (包含面试题) 本人8年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是Java后端开发. 面试了很多家公司,感觉大部分 ...
- Nmon安装
下载对应系统的nomn工具(我用centos6.5_64位下载的是nmon_linux_14i.tar.gz) mkdir /nmon cd /nmon 导入nmon的tar.gz包解压 tar -z ...
- 配置Ant执行Jmeter脚本
1.将 jmeter下extras目录中ant-jmeter-1.1.1.jar包拷贝至ant安装目录下的lib目录中,否则会报错ant-jmeter-1.1.1不存在 2.在jmeter根目录下创建 ...