%生成二项式系数的mod兼容方式
%mod compatible ways of generating Binomial Coefficients
我想优化我的程序的一部分,在该部分中,我正在计算最高为K的二项式系数的总和,即
C(N,0) + C(N,1) + ... + C(N,K)
由于这些值超出了数据类型(long-long)所能支持的范围,我将计算mod M
的值,并正在寻找实现这一点的过程
目前,我已经用Pascal的三角形完成了这项工作,但它似乎需要一些负载。所以,我想知道是否还有其他有效的方法可以做到这一点。我考虑过Lucas定理,虽然M已经足够大了,所以C(N,k)已经失控了
任何关于我如何以不同的方式做到这一点的指针,也许可以用其他一些简洁的总和表达式来计算整个总和。如果没有,我将把它留给Pascal三角法本身
谢谢你,
以下是我目前拥有的O(N^2)
:
#define MAX 1000000007
long long NChooseK_Sum(int N, int K){
vector<long long> prevV, V;
prevV.push_back(1); prevV.push_back(1);
for(int i=2;i<=N;++i){
V.clear();
V.push_back(1);
for(int j=0;j<(i-1);++j){
long long val = prevV[j] + prevV[j+1];
if(val >= MAX)
val %= MAX;
V.push_back(val);
}
V.push_back(1);
prevV = V;
}
long long res=0;
for(int i=0;i<=K;++i){
res+=V[i];
if(res >= MAX)
res %= MAX;
}
return res;
}
执行线性算术bignum运算的算法是
def binom(n):
nck = 1
for k in range(n + 1): # 0..n
yield nck
nck = (nck * (n - k)) / (k + 1)
这使用除法,但对素数p
取模,你可以通过乘以方程i * (k + 1) = 1 mod p
的解i
来完成大致相同的事情。值i
可以通过扩展欧几里得算法在对数算术运算中找到。
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 重载方法的方式会在使用临时调用时生成编译器错误
- 在reactor中存储eventHandlers的最佳方式是什么
- 如何以优化的方式同时迭代两个间距不相等的数组
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 为什么C++有不同的变量初始化方式?
- 在AVX通道中混洗的最佳方式
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- 如何以静态代码分析友好的方式使用 #define 防护?
- %生成二项式系数的mod兼容方式