gpt4 book ai didi

c - 如何高效使用Modulo?

转载 作者:太空狗 更新时间:2023-10-29 17:03:09 25 4
gpt4 key购买 nike

我正在做一项(对我自己而言)非常复杂的任务,我必须在给定 n 个片段的情况下计算最大可能的序列数。

我发现加泰罗尼亚数字代表这个序列,我让它在 n<=32 时工作。我得到的结果应该计算为 mod 1.000.000.007。我遇到的问题是“q”和“p”对于 long long int 变大,我不能在除“q”和“p”之前只修改 1.000.000.007,因为我会得到不同的结果。

我的问题是,是否有真正有效的方法来解决我的问题,或者我是否必须考虑以不同方式存储值?我的限制如下:- 仅限 stdio.h/iostream- 只有整数- n<=20.000.000- n>=2

#include <stdio.h>

long long cat(long long l, long long m, long long n);

int main(){
long long n = 0;
long long val;
scanf("%lld", &n);

val = cat(1, 1, n / 2);

printf("%lld", (val));

return 0;
}

long long cat(long long q, long long p, long long n){
if (n == 0) {
return (q / p) % 1000000007;
}
else {
q *= 4 * n - 2;
}

p *= (n + 1);

return cat(q, p, n - 1);
}

最佳答案

要有效地解决这个问题,您需要使用 modular arithmetic , 与 modular inverses代替除法。

很容易证明,在没有溢出的情况下,(a * b) % c == ((a % c) * b) % c。如果我们只是乘法,我们可以在每一步取模 1000000007 的结果,并且始终保持在 64 位整数的范围内。问题是 split 。 (a/b) % c 不一定等于 ((a % c)/b) % c

为了解决除法问题,我们使用模逆。对于整数 acc 质数和 a % c != 0,我们总能找到一个整数b 这样 a * b % c == 1。这意味着我们可以将乘法用作除法。对于任何可被 a 整除的整数 d(d * b) % c == (d/a) % c。这意味着 ((d % c) * b) % c == (d/a) % c,所以我们可以减少中间结果 mod c 而不会搞砸我们的除法能力。

我们要计算的数字的格式为 (x1 * x2 * x3 * ...)/(y1 * y2 * y3 * ...) % 1000000007。我们可以改为计算 x = x1 % 1000000007 * x2 % 1000000007 * x3 % 1000000007 ...y = y1 % 1000000007 * y2 % 1000000007 * y3 % 1000000007 ...,然后使用 extended Euclidean algorithm 计算 y 的模逆 z并返回 (x * z) % 1000000007

关于c - 如何高效使用Modulo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com