实际问题就像我从在线比赛中得到的那样。我解决了它,但我的解决方案,在C中,无法及时为大数字产生答案。我需要在C中解决它。
以下是英语词典中的一个单词,排列为矩阵:
MATHE
ATHEM
THEMA
HEMAT
EMATI
MATIC
ATICS
跟踪矩阵从左上角开始,每步向右或向下移动,到达矩阵的右下角。确保任何此类跟踪都生成相同的单词。对于长度为m + n-1的给定单词写成大小为m * n的矩阵,可以进行多少次这样的描记?
1≤m,n≤10^ 6
我必须按照问题陈述中的说明打印单词可以跟踪的方式。如果数字大于10 ^ 9 + 7,我必须打印S mod(10 ^ 9 + 7)。
在测试用例中,m和n可能非常大。
答案 0 :(得分: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
当然,模数运算中的^ -1不需要等于1 / a,并且可以使用扩展欧几里得算法计算,因为在你的情况下mod是素数因此
(a^(-1))=a^(mod-2)%mod
a ^(mod-2)可以使用重复平方法有效地计算。
答案 1 :(得分:0)
我建议对这个问题采用动态编程方法,因为计算大数的阶乘会涉及很多时间,特别是因为你有多个查询。
从一个小矩阵(比如2x1
)开始,继续寻找更大矩阵的解决方案。请注意,此解决方案的工作原理是,在找到更大矩阵的解决方案时,您可以使用为较小矩阵计算的值,并加快计算速度。
上述解决方案IMO的复杂性是M
和N
矩阵的MxN
多项式。
答案 2 :(得分:0)
使用拉普拉斯的三角形,错误地命名为“二项式”
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
知道了吗?请注意,元素可以计为二项式成员。 diag成员在这里:C ^ 1_2,C ^ 2_4,C ^ 3_6,C ^ 4_8等。选择你需要的。