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 ...
随机推荐
- FastEarth
1 概述 FastEarth(后文简称FE)是自主研发的跨平台三维地理信息可视化协作平台,内置完全自主研发的XDR渲染引擎,无缝对接主流地理信息平台数据.建筑BIM.工厂PIM以及多种三 ...
- Java 学习笔记之 线程sleep方法
线程sleep方法: 单主线程使用sleep: Main线程差了2000毫秒. public class MainSleepThread extends Thread{ @Override publi ...
- SpringBootSecurity学习(21)前后端分离版之OAuth2.0非对称加密
JWT转换器 前面的例子中,都是在授权服务配置类中配置了一个很简单的jwt转换器,如下: 可以看到我们只用setSigningKey方法配置了一个秘钥,这里使用的是简单的对称加密的方式来加密jwt内容 ...
- Angular: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as ‘standalone’ in ngModelOptions.
在Angular中,动态生成的Html控件,如果没有name属性并且在ts中要操作Model的内容.就会引发如题的错误. 解决方案两个: 加上name的属性 设置ngModelOptions [n ...
- 创建一个 Laravel 项目
创建一个 Laravel 项目,首先需要安装 Composer ,如果没有安装的参考 https://docs.phpcomposer.com/00-intro.html 一.安装 Laravel 安 ...
- 超详细的FreeRTOS移植全教程——基于srm32
### 准备 在移植之前,我们首先要获取到FreeRTOS的官方的源码包.这里我们提供两个下载链接: > 一个是官网:http://www.freertos.org/ > 另外一个是代码托 ...
- Adobe PS常用快捷键
ps使用快捷键 新建图层 Ctrl+Shift+N 取消选择区 Ctrl + D 新建标题 Ctrl + N 图片放大 Alt+鼠标滑动 图片位置拖动 空格 + 鼠标拖动 移动图层 ...
- Java集合总结—再也不怕面试问到集合了
Java集合总结 1.常见的集合 Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap ...
- Road Construction
King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...
- wildfly(JBoss AS)应用服务器快速入门
什么是wildfly JBoss AS 从8版本起名为wildfly.Wildfly是一个开源的基于JavaEE的轻量级应用服务器.可以在任何商业应用中免费使用. WildFly是一个灵活的.轻量的. ...