【发布时间】:2012-06-09 19:56:35
【问题描述】:
让:
int k = 99999989;
k 是一个素数。
给定一些(32 位)int x,我们要计算 x 阶乘 mod k。 (x!% k)
一种方法如下:
int factmk(int x)
{
long long t = 1;
for (long long i = 2; i <= x; i++)
{
t *= i;
t %= k;
}
return (int)t;
};
这需要 O(x) 时间和 O(1) 空间。
在小于或等于 O(logx) 的空间中,是否有一种渐近更快的方法可以在直接 C 中实现 factmk?如果是,那是什么?如果没有,草图证明。
【问题讨论】:
-
可能转移到math.stackexchange.com?那里有一些令人惊叹的神童,你也可以谈论..
-
好吧,如果
n >= k,那么n! % k == 0,所以它是O(1) ;) -
大概查找表是不可能的:-P
-
除此之外,这是一个很好的问题,但重复了。您可以减少工作,但没有办法将其减少到低于
k/2乘法。 -
@DanielFischer:从技术上讲,输入的数量是有限的,所以查找表是 O(1) 时间和 O(1) 空间,但我想你知道我的意思。跨度>