展開
題目描述
眾所周知,小蔥同學擅長計算,尤其擅長計算組合數,所以小蔥給了你兩個數 nn 和 kk,希望你找到 kk 個不同的組合數使得這 kk 個組合數的和最大。所謂不同的組合數,即對於組合數 c_^ca1
b1
和 c_^ca2
b2
,若 a_1\neq a_2a1
=a2
或者 b_1\neq b_2b1
=b2
,則我們認為這兩個組合數是不同的。現在小蔥希望你找到這樣 kk 個不同的組合數,使得它們互不相同且對於其中任何乙個組合數 c_a^bcab
有 0\leq b\leq a\leq n0≤b≤a≤n。問這 kk 個組合數的和最大是多少?
輸入格式
從標準輸入讀入資料。
第一行兩個整數 n,kn,k。
輸出格式
輸出到標準輸出。
一行乙個整數,代表 kk 個組合數的和對 10^9+710
9+7 取模之後的結果;資料保證一定有至少 kk 個數可以選。
輸入輸出樣例
輸入 #1複製
2 3輸出 #1複製
4說明/提示
對於 20%20% 的資料,n\leq 10n≤10。
對於 40%40% 的資料,n\leq 500n≤500。
對於另外 20%20% 的資料,k=1k=1。
對於 100%100% 的資料,1\leq n\leq 10^6,1\leq k\leq 10^5.1≤n≤10
6,1≤k≤105.
可以通過楊輝三角與組合數的關係得到,c(n
,n/2
)c(n,n/2)
c(n,n/
2)是值最大的。
通過b fs
bfsbf
s擴充套件k
kk次,每次用set
setse
t判斷是否重複選擇
用s et
setse
t存下x∗n
+y
x* n+y
x∗n+y看set
setse
t的si
zsiz
size是否變大判斷該點是否被擴充套件過了
b fs
bfsbf
s中用優先佇列每次選取c()
c()c(
)最大的加到ans
ansan
s裡並擴充套件
但是優先佇列在比較c()
c()c(
)大小時需要比較的時c()
c()c(
)未mo
dmod
mod時的大小,這樣會導致炸lon
glong
long
l on
glong
long
比較c (x
,y
)c(x,y)
c(x,y)
的大小可以轉化為比較log
(x!)
−log
(y!)
−log
((x−
y)!)
log(x!)-log(y!)-log((x-y)!)
log(x!
)−lo
g(y!
)−lo
g((x
−y)!
)預處理i=1
i=1i=1to
toto
n
nn的log
(i!)
log(i!)
log(i!
)公式: lg1
=0
lg_1=0
lg1=0
,l gi
=lgi
−1+l
og(i
)lg_i=lg_+log(i)
lgi=l
gi−1
+lo
g(i)
#include
#deunfacne ll long long
using
namespace std;
const ll mod=
1000000007
,n=1e6+77
;ll fac[n]
=,inv[n]
=,unfac[n]=;
double lo[n]=;
ll c
(int m,
int n)
struct node};
priority_queue q;
intmain()
int l,r,k;
ll ans=0;
scanf
("%d%d"
,&r,
&k); l=0;
for(
int i=l;i<=r;i++
) q.
push
((node));
node t;
while
(k));}
printf
("%lld\n"
,ans)
;}
Code 4 組合數問題2
luogu4370 一開始入隊的數字肯定是 c n 然後將它上下左右能入堆的入堆,取出堆首元素後以此類推 要注意同乙個組合數不能重複進堆,所以需要判重,但是如果根據當前擴充套件的元素是否在答案序列中來判斷是否應該進堆,比如這樣 void bfs int n,int k dy 4 q.push com...
P4370 Code 4 組合數問題2
題目要求當 0 leq a leq b leq n 時,k 個 tbinom 的和的最大值 觀察楊輝三角形,可以發現,最大的 tbinom 為 tbinom 還可以知道,除了當前最大的組合數以外,可能最大的,是它周圍的四個 即如果當前確定的最大組合數為 tbinom 則接下來有可能成為最大的數是 t...
求值2 組合數公式題目
ans 0 for inti 1 i n i for int v 0 v n v ans ans c i,v c i,v 998244353 c i,v 為組合數第i行第v列的數。給你上面的 中的n,請你輸出ans的值。輸入乙個整數n輸出ans的值。示例1 複製3複製 這題然後就變成了 求組合數的問...