c – 计算多项系数
作者:互联网
我想计算多项式系数mod 1e9 7.它等于:n! /(k0!* k1!* k2 * … * km!)
在我的情况下m = 3,k0 k1 k2 = n,所以它将是:n! /(k0!* k1!* k2!)我的代码:
....
long long k2 = n - k1 - k0;
long long dans = fact[n] % MOD;
long long tmp = fact[i] % MOD;
tmp = (tmp * fact[j]) % MOD;
tmp = (tpm * fact[k]) % MOD;
res = (fact[n] / tmp) % MOD; // mb mistake is here...
cout << res;
事实[i] – i mod 1e9的阶乘7
它不适用于大型测试
解决方法:
我希望我不是在这里联系,但这是一个工作过程,以解决你的问题:
>天真的实现总是会遇到溢出错误.您必须准备好利用多项式系数的某些数学属性来达到稳健的解决方案. Dave Barber在他的library中使用了递归属性(例如4个数字 – 当所有分支被零替换时递归停止)
multi (a, b, c, d) = multi (a − 1, b, c, d) + multi (a, b − 1, c, d) + multi (a, b, c − 1, d) + multi (a, b, c, d − 1)
>基于以上所述,DavidSerranoMartínez展示了如何提供提供溢出控制的implementation.他的代码可以像使用一样轻松
unsigned long long result_2 = multinomial::multi<unsigned long long>({9, 8, 4});
>第三种选择是使用(或学习)专用于组合的库,如SUBSET.由于依赖性和长度,这是一个更难阅读的代码,但是调用就像
int factors[4] = {1, 2, 3, 4};
Maths::Combinatorics::Arithmetic::multinomial(4, factors)
标签:algebra,c,combinatorics 来源: https://codeday.me/bug/20190728/1562963.html