我想要存储的是一个特定的一行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;
}
请告诉我们这样做的正确方法谢谢
答案 0 :(得分:1)
Pascal三角形的元素和选择函数之间存在关系(其中n选择r = n!/(r!*(nr)!)。)具体来说,从零开始, Pascal三角形的第n行和第r列是n选择r。要找到一个特定的行,你知道你想要什么,然后你应该迭代r的可能值,找到n选择r,然后取你的模数。
我建议使用Java的BigInteger类,因为它可以处理您可能遇到的任何溢出错误。