当前位置: 首页 > news >正文

HDU-5950 Recursive sequence(矩阵乘法)

题意:

给定A、B作为f(1)、f(2),f(n) = 2*f(n-2) + f(n-1) + n^4,求第n项。

思路:

都会很容易想到矩阵乘法,但是多了一个n^4,所以关键就在于怎么在n^4和(n+1)^4之间进行转移了。

已知:(a+b)^n = C(n, 0)*a^n*b^0 + C(n, 0)*a^(n-1)*b^1 + ... + C(n, i)*a^(n-i)*b^i + ... + C(n, n)*a^0*b^n。

将(n+1)^4展开:n^4 + 4*n^3 + 6*n^2 + 4*n^4 + 1,从而我们就可以构造出矩阵

|(n+1)^4|   |1 4 6 4 1| |n^4|
|(n+1)^3|   |0 1 3 3 1| |n^3|
|(n+1)^2| = |0 0 1 2 1|*|n^2|
|(n+1)^1|   |0 0 0 1 1| |n^1|
|   1   |   |0 0 0 0 1| | 1 |

再代入总的矩阵中即可矩阵快速幂求解。

可以发现这题的公式是非线性的,所以利用了展开多项式的方法将非线性部分能够通过线性方法求得。第一次做这种递推题,涨姿势了。

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 2147493647ll;
struct mtx {
	ll m[7][7];
	mtx(){memset(m, 0, sizeof m);}
};
int t;
ll n, A, B;
mtx multi(mtx x, mtx y)
{
	mtx res;
	for(int k = 0; k < 7; ++k)
	for(int i = 0; i < 7; ++i)
	for(int j = 0; j < 7; ++j)
	res.m[i][j] += x.m[i][k]*y.m[k][j]%mod,
	res.m[i][j] %= mod;
	return res;
}
ll qpow(ll n)
{
	mtx ans, bas, col;
	for(int i = 0; i < 7; ++i) ans.m[i][i] = 1;
	bas.m[0][0] = 1, bas.m[0][1] = 2, bas.m[0][2] = 1,
	bas.m[0][3] = 4, bas.m[0][4] = 6, bas.m[0][5] = 4,
	bas.m[0][6] = 1;
	bas.m[1][0] = 1;
	bas.m[2][2] = 1, bas.m[2][3] = 4, bas.m[2][4] = 6,
	bas.m[2][5] = 4, bas.m[2][6] = 1;
	bas.m[3][3] = 1, bas.m[3][4] = 3, bas.m[3][5] = 3,
	bas.m[3][6] = 1;
	bas.m[4][4] = 1, bas.m[4][5] = 2, bas.m[4][6] = 1;
	bas.m[5][5] = 1, bas.m[5][6] = 1;
	bas.m[6][6] = 1;
	col.m[0][0] = B, col.m[1][0] = A, col.m[2][0] = 2*2*2*2,
	col.m[3][0] = 2*2*2, col.m[4][0] = 2*2, col.m[5][0] = 2,
	col.m[6][0] = 1;
	while(n)
	{
		if(n&1) ans = multi(ans, bas);
		bas = multi(bas, bas);
		n >>= 1;
	}
	ans = multi(ans, col);
	return ans.m[0][0]%mod;
}
int main()
{
	for(scanf("%d", &t); t--;)
	{
		scanf("%lld %lld %lld", &n, &A, &B);
		if(n == 1ll) printf("%lld\n", A);
		else if(n == 2ll) printf("%lld\n", B);
		else printf("%lld\n", qpow(n-2));
	}
	return 0;
}


继续加油~

相关文章:

  • “互联网+”引发IT人才招工荒-新华网安徽频道
  • Java从文件读入以及读出至文件
  • HDU-5963 朋友(树上博弈)
  • HDU 6005 Pandaland(无向图最小环)
  • Cura源码在Ubuntu15.04上编译脚本(成功)
  • SPOJ - CHICAGO 106 miles to Chicago(乘积最短路)
  • HTML5之FileReader的使用
  • LeetCode 202 Happy Number(floyd判圈算法(龟兔赛跑算法))
  • css3 中text-align:justify
  • HDU-1503 Advanced Fruits(LCS)
  • LightOJ-1253 Misere Nim(Nim求解不正常的博弈)
  • python发送电子邮件模块smtplib
  • uva-1349 Optimal Bus Route Design(最小费用最大流)
  • 一个简单的通用验证类的实现
  • ZOJ-3987 Numbers 2017CCPC秦皇岛站G题 (二进制乱搞、贪心)
  • (三)从jvm层面了解线程的启动和停止
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Apache Zeppelin在Apache Trafodion上的可视化
  • HashMap ConcurrentHashMap
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • java中具有继承关系的类及其对象初始化顺序
  • Laravel5.4 Queues队列学习
  • magento 货币换算
  • npx命令介绍
  • overflow: hidden IE7无效
  • uva 10370 Above Average
  • 从零开始学习部署
  • 大快搜索数据爬虫技术实例安装教学篇
  • 动态规划入门(以爬楼梯为例)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 在Mac OS X上安装 Ruby运行环境
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​2020 年大前端技术趋势解读
  • !!java web学习笔记(一到五)
  • # Panda3d 碰撞检测系统介绍
  • # 达梦数据库知识点
  • (第61天)多租户架构(CDB/PDB)
  • (四)图像的%2线性拉伸
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)详解PHP处理密码的几种方式
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net Core与存储过程(一)
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET建议使用的大小写命名原则
  • .NET上SQLite的连接
  • [ C++ ] STL---仿函数与priority_queue
  • [20160902]rm -rf的惨案.txt