【发布时间】:2014-09-10 13:50:20
【问题描述】:
我需要计算(n*(2n+1)*(n+1)*(3(n^2)+3n+1))/30 modulo m,其中:
- 30 & m 可以是非互质的
- n 的值最高可达 10^10(对于 long long int 来说太大了)
- m 可以有任何值,最大为 10000
我试过这个:
long long int tp1;
double k;
k=n;
k=k*((2*n)+1);
k=k*(n+1);
k=k*((3*n*n)+(3*n)-1);
tp1=fmod(k/30,m);
【问题讨论】:
-
使用能够容纳至少 10000^2 的所有整数的类型(例如,
long long),并进行早期和急切的模减少以保持可接受的低值。 (10^10)^5 远远超过 2^64。 (我用 ^ 来表示功率,而不是 C 运算符按位异或)。 (% 是 C 中的整数余数运算符,了解余数和取模的区别) -
旁白(也是@Fr):如果可以避免的话,不要尝试用浮点数进行精确的整数计算。这里完全没有必要。
-
提示:
(x * y) mod m==((x mod m) * (y mod m)) mod m. -
@molbdnilo 但是我如何处理
(x/y) % m我已经尝试过(x % m / y^-1 ) % m但仍然没有用 -
@molbdnilo 但假设我的 x 是 10040,m 是 100,y 是 30,所以
10040 % 100 = 40和40 / 30 = 1而10040/30 = 335和335 % 100 = 35