矩阵快速幂锦上添花小结

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

相关文章

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建