Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)
F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3)
现在要求F[N]
类似于斐波那契数列的递推式子吧, 但是N最大能到int的最大值, 直接循环推解不了
所以就得用矩阵快速幂咯
现在就看转移矩阵长什么样了
Mi表示要求的矩阵 转移矩阵用A表示
A * Mi = Mi+1
矩阵Mi里面至少得有 F[i-1] F[i-2] i ^ 4 Mi+1就相应的有 F[i] F[i-1] (i+1)^4
(i+1)^4 = i^4 + 4 * i ^ 3 + 6 * i ^ 2 + 4 * i + 1
所以Mi中还得有i^3 i^2 i 1
总共就有七个元素
$\begin{pmatrix} 1 & 2 & 1 & 0 & 0 & 0 & 0 \\ 1 & 0& 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 4 & 6 & 4 & 1 \\ 0 & 0 & 0 & 1 & 3 & 3 & 1 \\ 0 & 0 & 0 & 0 & 1 & 2 & 1 \\ 0 & 0 & 0 & 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1\end{pmatrix}
\times \begin{pmatrix} f_{i-1} \\ f_{i-2} \\ i^{4} \\ i^{3} \\ i^{2} \\ i \\ 1 \end{pmatrix} = \begin{pmatrix} f_{i} \\ f_{i-1} \\ (i+1)^{4} \\ (i+1)^{3} \\ (i+1)^{2} \\ i+1 \\ 1 \end{pmatrix}$
基本的矩阵运算,就是前面这个相当于系数的矩阵得是 (n-2)次幂 因为f1 f2都求过了
初始的矩阵是
$\begin{pmatrix} f_{2} \\ f_{1} \\ 3^{4} \\ 3^{3} \\ 3^{2} \\ 3 \\ 1 \end{pmatrix}$
也就是
$\begin{pmatrix} b \\ a \\ 81 \\ 27 \\ 9 \\ 3 \\ 1 \end{pmatrix}$
特判一下n == 1 和 2的情况就好啦
代码如下
#include <cstdio>
#define ll long long
#define MOD 2147493647
using namespace std; struct Matrix {
ll m[][];
Matrix() {
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
m[i][j] = ;
}
}; Matrix mul(Matrix A, Matrix B) {
Matrix temp;
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
for (int k = ; k < ; k++)
temp.m[i][j] = (temp.m[i][j] % MOD+ A.m[i][k] * B.m[k][j] % MOD) % MOD;
return temp;
} Matrix quick_mod(Matrix A, ll b) {
Matrix ans;
for (int i = ; i < ; i++)
ans.m[i][i] = ;
while (b) {
if (b & ) ans = mul(ans, A);
A = mul(A, A);
b >>= ;
}
return ans;
} 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 {
Matrix ans;
ans.m[][] = , ans.m[][] = , ans.m[][] = ;
ans.m[][] = ;
ans.m[][] = , ans.m[][] = , ans.m[][] = , ans.m[][] = , ans.m[][] = ;
ans.m[][] = , ans.m[][] = , ans.m[][] = , ans.m[][] = ;
ans.m[][] = , ans.m[][] = , ans.m[][] = ;
ans.m[][] = , ans.m[][] = , ans.m[][] = ;
ans = quick_mod(ans, (ll)n - );
Matrix temp;
temp.m[][] = b, temp.m[][] = a, temp.m[][] = , temp.m[][] = ;
temp.m[][] = , temp.m[][] = , temp.m[][] = ;
ans = mul(ans, temp);
printf("%lld\n", ans.m[][] % MOD);
}
}
return ;
}
其实可以封装一下Matrix 重载一下 * 和 ^ 运算符 这样就很方便也很好看啦
Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)的更多相关文章
- hdu 2604 递推 矩阵快速幂
HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- hdu 6185 递推+矩阵快速幂
思路:考虑全部铺满时,前2列的放法.有如下5种情况:(转自http://blog.csdn.net/elbadaernu/article/details/77825979 写的很详细 膜一下) 假设 ...
- 2018.10.09 NOIP模拟 路途(递推+矩阵快速幂优化)
传送门 签到题.(考试的时候写挂爆0) 令AiA_iAi表示邻接矩阵的iii次幂. 于是就是求Al+Al+1+...+ArA_l+A_{l+1}+...+A_rAl+Al+1+...+Ar. ...
- HDU Queuing(递推+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- LightOJ 1244 - Tiles 猜递推+矩阵快速幂
http://www.lightoj.com/volume_showproblem.php?problem=1244 题意:给出六种积木,不能旋转,翻转,问填充2XN的格子有几种方法.\(N < ...
- [hdu 2604] Queuing 递推 矩阵快速幂
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂)
Covering Bob's school has a big playground, boys and girls always play games here after school. To p ...
随机推荐
- GOjs版本2.0去除水印
在go.js找到:"7eba17a4ca3b1a8346" 找到这个关键字,将: 改成:a.br=function(){return true}即可.
- Ubuntu使用小技巧
1. Ubuntu下自由截图 Ubuntu下使用PrintScreen按键可以截取整个屏幕,但是很多时候并不需要那么多内容,还需要对图片进行编辑. 这时候就需要截图时,有矩形选择,更符合要求. 进入S ...
- JasperReport制作行内容合并的表格
效果图: 实现思路一: 交叉表 另一个思路: 普通表格 缺点:无法实现内容 垂直居中显示 准备工作 一.数据准备 DROP TABLE IF EXISTS `address_item_sex_valu ...
- EntityFramework Core问题处理集锦(一)
前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...
- SpringBoot整合Druid数据源
关于SpringBoot数据源请参考我上一篇文章:https://www.cnblogs.com/yueshutong/p/9409295.html 一:Druid介绍 1. Druid是什么? Dr ...
- mockjs使用
/** * 使用mockjs来mock数据, 提供mock数据API接口 */ import Mock from 'mockjs' import data from './data.json' //注 ...
- Python中Socket粘包问题的解决
服务器端 import socket import subprocess import struct server = socket.socket() ip_port = ("192.168 ...
- Ordering Tasks
链接 [https://vjudge.net/contest/281085#problem/D] 题意 有n个任务,有M个对先后顺序 然你输出最后的完成任务的顺序,有多种可能输出一种即可 分析 裸的拓 ...
- 将工程改造为SOA架构
商城是基于soa的架构,表现层和服务层是不同的工程.所以要实现商品列表查询需要两个系统之间进行通信. 流动计算架构 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基 ...
- mysql 中Varchar 与char的区别
一.字符与字节与编码关系 ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制.最 ...