矩阵从左上到右下导航,只能向右或向下移动?
Posted
技术标签:
【中文标题】矩阵从左上到右下导航,只能向右或向下移动?【英文标题】:Navigation of matrix from left top to right bottom, only moving to the right or downwards? 【发布时间】:2014-01-20 04:36:44 【问题描述】:实际问题是这样的,我从在线比赛中得到。我解决了它,但我的 C 语言解决方案无法及时为大量数字提供答案。我需要用 C 来解决它。
以下是英语词典中的一个以矩阵形式排列的单词:
MATHE
ATHEM
THEMA
HEMAT
EMATI
MATIC
ATICS
从左上角开始跟踪矩阵,每一步向右或向下移动,到达矩阵的右下角。可以确保任何此类跟踪都会生成相同的单词。对于长度为 m+n-1 的给定单词,写成大小为 m * n 的矩阵,可以进行多少次这样的跟踪?
1 ≤ m,n ≤ 10^6
我必须按照问题陈述中的说明打印出可以追踪 S 单词的方式的数量。如果数字大于 10^9+7,我必须打印 S mod (10^9 + 7)。
在测试用例中,m 和 n 可以很大。
【问题讨论】:
【参考方案1】:想象一下遍历矩阵,无论你选择什么路径,你都需要精确地 n+m-2 步来生成单词,其中 n-1 向下,m-1 向右,它们的顺序可能会改变,但数字 n-1 和 m-1 保持不变。所以问题被简化为只从 n+m-2 中选择 n-1 个位置,所以答案是
C(n+m-2,n-1)=C(n+m-2,m-1)
如何计算这个问题的 C(n,r):
您一定知道如何在模运算中将两个数字相乘,即
(a*b)%mod=(a%mod*b%mod)%mod
,
现在要计算 C(n,r),您还需要除法,但模算术中的除法可以通过使用数字的模乘逆来执行,即
((a)*(a^-1))%mod=1
当然,模算术中的 a^-1 不必等于 1/a,并且可以使用扩展欧几里得算法计算,因为在您的情况下 mod 是一个素数
(a^(-1))=a^(mod-2)%mod
a^(mod-2) 可以使用重复平方方法有效地计算。
【讨论】:
我知道这个解决方案,但是我如何计算大数的阶乘,例如 50 或 100 在问题中提到它可以达到 10^6。 你能解释一下如何 (a^(-1))=a^(mod-2)%mod . @vj1207 它是模算术中的一个属性。【参考方案2】:我建议使用动态编程方法来解决这个问题,因为计算大数的阶乘需要很多时间,尤其是当您有多个查询时。
从一个小矩阵(比如2x1
)开始,不断寻找更大矩阵的解决方案。请注意,此解决方案有效,因为在寻找更大矩阵的解决方案时,您可以使用针对较小矩阵计算的值并加快计算速度。
上述解决方案 IMO 的复杂性是 M
和 N
中的多项式 MxN
矩阵。
【讨论】:
【参考方案3】:使用拉普拉斯三角形,错误地命名为“二项式”
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 0 0 0
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 0 0
1 2 0 0 0
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 0
1 2 3 0 0
1 3 0 0 0
1 0 0 0 0
0 0 0 0 0
1 1 1 1 1
1 2 3 4 0
1 3 6 0 0
1 4 0 0 0
1 0 0 0 0
1 1 1 1 1
1 2 3 4 5
1 3 6 10 0
1 4 10 0 0
1 5 0 0 0
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 0
1 5 15 0 0
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 0
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 70
明白了吗?请注意,元素可以算作二项式成员。诊断成员在这里:C^1_2、C^2_4、C^3_6、C^4_8 等等。选择您需要的。
【讨论】:
我知道它就像帕斯卡三角形,但上面问题中的行和列可能并不总是相同的。以上是关于矩阵从左上到右下导航,只能向右或向下移动?的主要内容,如果未能解决你的问题,请参考以下文章