c++ - 第 N 个四面体数 mod m?

标签 c++ algorithm

<分区>

嗨,我被困在我的任务中,部分要求我找到第 n 个四面体数 mod m。四面体数是前面所有 n 个三角形数的总和,用公式 (n(n+1)(n+2))/6 表示。鉴于我应该找到数字的模数并且第 n 个三角数可以超过 long long int 的大小,我可以知道是否有计算这个或其他方法来找到第 n 个四面体数的方法?模 m 可以达到 100000,所以我不确定帕斯卡三角是否适用于此。谢谢。

最佳答案

Modular arithmetic具有以下属性

(a*b) % m == ((a % m) * (b % m)) % m

您可以使用该等价性将您的数字保持在一系列标准整数类型中。但是,当您将总和除以 6 时应该小心,因为模等价对于除法而言不一定正确。您可以通过先计算所有内容对 6*m 取模,然后对所有内容取模 m 来规避此问题。

您的计算必须能够安全地将两个数字相乘为模 m。在这里,你最多需要 (6 · 100,000)²,它适合 64 位整数,但不适合 32 位整数:

std::uint64_t tetra_mod(std::uint64_t n, std::uint64_t m)
{
    std::uint64_t m6 = 6*m;

    std::uint64_t n0 = n % m6;
    std::uint64_t n1 = (n + 1) % m6;
    std::uint64_t n2 = (n + 2) % m6;

    return (n0 + n1 + n2) % m6 / 6 % m;
}

关于c++ - 第 N 个四面体数 mod m?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41466576/

相关文章:

c++ - 为什么输出显示 0 而不是 0.0?

c++ - C++ 中的类/函数模板占用了我的二进制文件的百分比是多少?

c++ - 错误 : invalid initialization of reference of type ‘LineLayer&’ from expression of type ‘Layer’

c++ - 二进制操作数无效 ^

algorithm - 空间复杂度问题

algorithm - 在 2D 平面中划分一组点

c++ - 动态C++

algorithm - 如何使用 GCD 方法查找多个数字的 lcm?

algorithm - 插入等值元素

algorithm - 使用乘法实现加法