Nth Tetrehedral数mod m?

时间:2017-01-04 14:44:38

标签: c++ algorithm

嗨,我坚持我的任务,部分要求我找到第n个四面体数字mod m。四面体数是所有n个前三角数的总和,并由公式(n(n + 1)(n + 2))/ 6表示。鉴于我应该找到数字的模数并且第n个三角形数字可以超过long long int的大小,我可以知道是否有一种方法来计算这个或另一种方法来找到第n个四面体数?模数m最高可达100000,所以我不确定pascal的三角形是否可以在这里工作。谢谢。

1 个答案:

答案 0 :(得分:1)

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;
}