題目要求當\(0\leq a\leq b\leq n\)時,\(k\)個\(\tbinom\)的和的最大值
觀察楊輝三角形,可以發現,最大的\(\tbinom\),為\(\tbinom}\)
還可以知道,除了當前最大的組合數以外,可能最大的,是它周圍的四個
即如果當前確定的最大組合數為\(\tbinom\),則接下來有可能成為最大的數是:\(\tbinom,\tbinom,\tbinom,\tbinom\)
可以寫乙個楊輝三角理解一下
然後可以用乙個優先佇列維護,每次取出當前的最大值
那麼如何比較兩個組合數的大小?寫高精算出來(bushi
用乙個神奇的方法:取\(\log\)
由\(\log ab=\log a+\log b,\log\frac=\log a-\log b\)
則可以先預處理出\(\log x!,0\leq x\leq n\),然後再算組合數\(\tbinom=\log n!-\log m!-\log (n-m)!\)
然後在堆中比較\(\log\)的大小
然後我愉快的把堆寫炸了
算組合數就是預處理階乘和階乘逆元就行了
一定要記得判斷當前最大的組合數周圍的那四個數是否存在,具體見**
#include#include#include#include#include#include#include#define reg register
#define en std::puts("")
#define ll long long
inline int read()
while(c>='0'&&c<='9')
return y?x:-x;
}int n,k;
const ll mod=1e9+7;
struct datadui[500006];
int size;
ll fac[1000006],inv[1000006];
double log[1000006];
std::map,bool>map;
inline void push(data x)
}inline data pop()
return ret;
}inline ll power(ll a,ll b)
return ret;
}inline void pre()
inline double getlog(int nn,int mm)
int main());
reg data now;
reg ll ans=0;
std::pairtmp;
reg int nn,mm;
while(k--));
} if(mm+1<=nn));
} if(mm-1>=0&&nn-1>=0));
} if(nn-1>=mm));
} }std::printf("%lld",ans);
return 0;
}
Code 4 組合數問題2
展開 題目描述 眾所周知,小蔥同學擅長計算,尤其擅長計算組合數,所以小蔥給了你兩個數 nn 和 kk,希望你找到 kk 個不同的組合數使得這 kk 個組合數的和最大。所謂不同的組合數,即對於組合數 c ca1 b1 和 c ca2 b2 若 a 1 neq a 2a1 a2 或者 b 1 neq b...
Code 4 組合數問題2
luogu4370 一開始入隊的數字肯定是 c n 然後將它上下左右能入堆的入堆,取出堆首元素後以此類推 要注意同乙個組合數不能重複進堆,所以需要判重,但是如果根據當前擴充套件的元素是否在答案序列中來判斷是否應該進堆,比如這樣 void bfs int n,int k dy 4 q.push com...
P2822 組合數問題
題目描述 組合數c n mc n m 表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定 義,我們可以給出計算組合數的一般公式 c n m m n m n 其中n 1 2 n 不清楚不要怪我,暫時找...