【发布时间】:2012-08-09 22:40:06
【问题描述】:
我想生成所有Motzkin Number 并存储在一个数组中。公式如下:
我目前的实现太慢了:
void generate_slow() {
mm[0] = 1;
mm[1] = 1;
mm[2] = 2;
mm[3] = 4;
mm[4] = 9;
ull result;
for (int i = 5; i <= MAX_NUMBERS; ++i) {
result = mm[i - 1];
for (int k = 0; k <= (i - 2); ++k) {
result = (result + ((mm[k] * mm[i - 2 - k]) % MODULO)) % MODULO;
}
mm[i] = result;
}
}
void generate_slightly_faster() {
mm[0] = 1;
mm[1] = 1;
mm[2] = 2;
mm[3] = 4;
mm[4] = 9;
ull result;
for (int i = 5; i <= MAX_NUMBERS; ++i) {
result = mm[i - 1];
for (int l = 0, r = i - 2; l <= r; ++l, --r) {
if (l != r) {
result = (result + (2 * (mm[l] * mm[r]) % MODULO)) % MODULO;
}
else {
result = (result + ((mm[l] * mm[r]) % MODULO)) % MODULO;
}
}
mm[i] = result;
}
}
此外,我一直在寻找递归矩阵的封闭形式,以便我可以应用指数平方。任何人都可以提出更好的算法吗?谢谢。
编辑我无法应用第二个公式,因为对数字取模时除法不适用。 n 的最大值为 10,000,超出了 64 位整数的范围,因此答案是对较大的数 m 进行模运算,其中 m = 10^14 + 7。不允许使用更大的整数库。
【问题讨论】:
-
你可能想让你的标题更有趣一点;)
-
@therefromhere:谢谢,会的。
-
我不明白。您是否实现了仅依赖于 n、M_n 和 M_{n-1} 的 M_{n+1} 表达式?那应该很快。
-
@user827992:已经问过了,但我想这个问题与编程技术更相关。从第二个公式可以看出,数学公式是微不足道的。
-
你说“问题”——这是作业还是面试问题,还是一些编程挑战?
标签: c++ algorithm optimization motzkin-numbers