Code 4 組合數問題2

2021-10-05 14:53:57 字數 2586 閱讀 6992

展開

題目描述

眾所周知,小蔥同學擅長計算,尤其擅長計算組合數,所以小蔥給了你兩個數 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複製 這題然後就變成了 求組合數的問...