矩阵快速幂锦上添花小结

2024-06-07 03:32

本文主要是介绍矩阵快速幂锦上添花小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

又做了一个矩阵的专题。。表示又有更深的理解了。。

专题链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=60916#overview 密码nyist


剩下C、F、G、R表示接下来搞吧。。不想在写了。。

C题是一个组合数学+矩阵快速幂。F是一个不知道什么意思的题。。G是dp+矩阵快速幂。。R是一个Little Keng。。就想他的题目名称一样。小坑。。


其他题给一些简单的题解。。

A题是问你有多少个指向上方的三角形有多少个。。我们手动画几个可以发现。。上一个向上的三角形可以产生3个向上的三角形和1个向下的三角形。。同样一个向下的三角形可以产生1个向上的三角形和3个向下的三角形。。这样状态转移矩阵就可以出来了。。

A ={

 1, 3

 3, 1

}

水水的题目。。


B题就是广义斐波那契数列求第n项。。。水水更健康。。


D题题意:


The bear came out to walk across the field. At the beginning of the walk his speed is(dx, dy). Then the bear spends exactlyt seconds on the field. Each second the following takes place:

  • Let's suppose that at the current moment the bear is in cell (x, y).
  • First the bear eats the raspberry from all the bushes he has in the current cell. After the bear eats the raspberry fromk bushes, he increases each component of his speed byk. In other words, if before eating the k bushes of raspberry his speed was (dx, dy), then after eating the berry his speed equals(dx + k, dy + k).
  • Let's denote the current speed of the bear (dx, dy) (it was increased after the previous step). Then the bear moves from cell(x, y) to cell (((x + dx - 1) mod n) + 1, ((y + dy - 1) mod n) + 1).
  • Then one additional raspberry bush grows in each cell of the field.

You task is to predict the bear's actions. Find the cell he ends up in if he starts from cell(sx, sy). Assume that each bush has infinitely much raspberry and the bear will never eat all of it.

翻译一下:

那个熊要穿过那个领域。一开始,他的速度为(dx, dy)。然后,熊度过了正好t秒在那个领域上。每秒发生下面的:

1.我们假设一开始熊在(x, y)这个位置。

2.那个熊先吃木莓现在在的那个更位置。当那个熊吃了k bushes,他的速度在每个方向增加了k。话句话说,如果他吃木莓之前的速度为(dx, dy),那么他吃完之后的速度为(dx + k, dy + k)。

3.我们用(dx, dy)代表现在的速度。那么熊要从(x, y) 到( (x + dx - 1) % n + 1, (y + dy - 1) % n + 1)。

4.然后,额外的一个木莓生生长出来在每个位置。。

你的任务是预测那个熊的行为。找出他的位置在最后的时候。假设初始的时候有足够多的木莓,并且那个熊不会吃完它。

自己理解的题意:

(x, y) 为现在的位置,下一秒会到达(x + dx , y + dy)。。这个(dx, dy)    为速度变化后的速度。。这一点还是需要注意的。。

如果连先后顺序都不知道的,还搞什么acm!!!!

当然,我们把领域的1 - n 可以映射到的 0 -  n - 1    就可以直接对n取模就好了。。。

状态转移矩阵也是比较好推的。。。

x = (2 * x + y + dx),

y = (x + 2 * y + dy),

dx = (dx + x + y + t),

dy = (dy + x + y + t).

简单写了一下推到状态矩阵的思路。。。矩阵就直接推了。。。


E题意给你a + b , ab。让你求a^n + b^n。。这个就需要推一下啦。。同过别人的提示,还是顺利的推出来了。。

设x = a + b, y = ab

f1 = x, f2 = x^2 - 2 * y, f3 = f2 * x - f1 * y, f4 = f3 * x - f2 *  y....具体怎么推出来的。。我们还是要手动模拟一下。。

我发现。- - 有些规律直接就可以手动推出来的。。在你推的过程中,规律也就出来了。。。

继续说这个东西。。规律也就看出来了fn = fn-1 * x - fn-2 * y

转移矩阵也就就出来了。。

A ={

   x, 1

   -y, 0

}

推出规律也就水水的出了。。


G题是一个dp+矩阵快速幂。。表示看了题解也是不太了解。。。dp造诣基本没有。。


H竟然不是矩阵,好吧。。欧拉函数。。模板上去,水水的就过了。


I 就是求广义斐波那契数列的后m为数。1<= m<= 4。。。水水的。。


J题看了很长时间的题意就是不知道什么意思。。上网搜了一下题目意思。。。

翻译:

The fibonacci number is defined by the following recurrence:

  • fib(0) = 0
  • fib(1) = 1
  • fib(n) = fib(n-1)+fib(n-2)

But we're not interested in the fibonacci numbers here. We would like to know how many calls does it take to evaluate then th fibonacci number if we follow the given recurrence. Since the numbers are going to be quite large, we'd like to make the job a bit easy for you. We'd only need the last digit of the number of calls, when this number is represented in baseb.


但是,我们这次对斐波那契数列是不感兴趣的。我们想要知道第n个斐波那契数他调用了多少次的函数。。因为次数可能是非常大的,我们想要使得这个任务更容易。。我们需要的这个次数在b进制下的最后一位。

然后就可以水水的过了。。

他调用的次数就是发fn = 2 * Fn - 1。。

水水的就过了。。

在期间WA了n多发后发现输出结果错了。。

printf("%lld %d %d\n", n, mod, (2 * ans.a[1][1] - 1) % mod);
这是错误的。。为什么? 因为 - 1 的存在。。。
cout << n << ' ' << mod << ' ' << (2 * ans.a[1][1] - 1 + mod) % mod << endl;
这就是对的。。。

PSSS:只要取模设计减法,必须+mod % mod。这样就是避免了取模出现负数的情况。。


K 广义斐波那契数列。。Fn = Fn-1 + Fn -2 + Fn-3。。。水水的。。。


L广义斐波那契数列。。。水水的。。


M题意n个人一排,m个数(1 - m),每个人选一个数,如果相邻人选的数相同的话,那么这个数必须> k。。

表示,这个是一个典型利用矩阵快速幂求解递推值的加速。。

可以推出来。。

dp[i][0]表示第i个人选择的是一个大于k的数。。dp[i][1]表示第i个人选择的是一个小于k的数。。

dp[i][0] = dp[i][0] * m - k + dp[i][1] * (m - k)。。

dp[i][1] = dp[i][0] * k + dp[i][1] * (k - 1)。。

ans = dp[n][0] + dp[n][1]。。

这样的递推就可以用矩阵快速幂来加速。。

A ={

    m - k, k

    m - k, k - 1

}。。

水水的。。


N以前写过。。


Ohttp://blog.csdn.net/u011394362/article/details/40370555      题解。。也是写过的。。


Pn个物种会进化。。一个物种到另一个物种的转化率为p。。如果一个物种没有的转化的话也就是说自身转化率为1。。否则为1 - p。。

比较有点小坑的就是。。Round your final result to an integer. 学到了一句话。。这句话的意思是四舍五入你的结果到一个整数。。学习了。。

这样,根据给的转化率推出来每两两的物种的转化率。然后就ok了。水水的。。。。


Q和P题很是类似。。


R一个逗比题。。不解释。。



总结:又一个专题的题目a完了。。对其有了更深的理解了。。

1.一般递推是可以用矩阵快速幂来进行加速的。。

2.对矩阵的认识不仅仅从数据范围上来进行判定了。。。更是对于状态转化的认识。。。

3.大型比赛应该不会出这种比较裸的了。。应该是算法柔和在一起来出的,有时间就可以练习一下这种题目。。





这篇关于矩阵快速幂锦上添花小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038050

相关文章

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

python中cv2.imdecode()与cv2.imencode()的使用小结

《python中cv2.imdecode()与cv2.imencode()的使用小结》本文介绍了cv2.imencode()和cv2.imdecode()函数的使用,文中通过示例代码介绍的非常详细,对... 目录1、图片路径带中文的读取和写入1.1 读取1.2 写入2、在网络中传输图片cv2.imencod

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn