Kまでの二項係数の合計を計算しているプログラムの一部を最適化したいと思います。
C(N,0) + C(N,1) + ... + C(N,K)
値はデータ型 (long long) がサポートできる範囲を超えているため、modM
で値を計算する必要があり、そのための手順を探していました。
現在、パスカルの三角形で実行していますが、少し負荷がかかるようです。だから、これを行うための他の効率的な方法があるかどうか疑問に思っていました。ルーカスの定理を検討しましたが、MI は既に十分に大きいため、C(N,k) は手に負えなくなります!
これをどのように別の方法で行うことができるかについての指針は、おそらく、合計の他のきちんとした式を使用して全体の合計を計算することです。そうでない場合は、パスカルの三角形メソッド自体に任せます。
ありがとうございました、
これが私がこれまでに持っているものです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;
}