计算特定行mod 10 ^ 9 + 7的pascal表

时间:2016-06-07 18:26:06

标签: algorithm math

我想要存储的是一个特定的一行pascal表元素mod 10 ^ 9 + 7在一个数组中我试图编码它但它失败了某个地方当值很大时像10 ^ 5  这是代码。我试图在这里应用模逆,模块算术这里mod是10 ^ 9 + 7

void pascal_row(ll n){
memset(soo,0,MAX);
soo[0] = 1; //First element is always 1
for(ll i=1; i<n/2+1; i++){ //Progress up, until reaching the middle value
   soo[i] = (  ( soo[i-1] %mod ) * (((   (n-i+1)%mod * calcInverse(i,mod)%mod) % mod ))%mod)%mod;


}
for(ll i=n/2+1; i<=n; i++){ //Copy the inverse of the first part
    soo[i] = soo[n-i]%mod;
}
}

这是我的模块化反函数看起来

long long calcInverse(long long a, long long n)
{
long long t = 0, newt = 1;
long long r = n, newr = a;
while (newr != 0) {
    auto quotient = r /newr;
    tie(t, newt) = make_tuple(newt, t- quotient * newt);
    tie(r, newr) = make_tuple(newr, r - quotient * newr);
}
if (r > 1)
    throw runtime_error("a is not invertible");
if (t < 0)
    t += n;
return t;
}

请告诉我们这样做的正确方法谢谢

1 个答案:

答案 0 :(得分:1)

Pascal三角形的元素和选择函数之间存在关系(其中n选择r = n!/(r!*(nr)!)。)具体来说,从零开始, Pascal三角形的第n行和第r列是n选择r。要找到一个特定的行,你知道你想要什么,然后你应该迭代r的可能值,找到n选择r,然后取你的模数。

我建议使用Java的BigInteger类,因为它可以处理您可能遇到的任何溢出错误。