其實比賽時就想的差不多了。我是從xk
x
k入手的,看到這個,我就想到:現在有
x x
種東西,放到
k' role="presentation" style="position: relative;">k
k個不同箱子裡的方案數。然後
k<=
5000
k
<=
5000
,考慮從
k k
入手,f[
i][j
]' role="presentation" style="position: relative;">f[i
][j]
f[i]
[j]表示到第
i i
個箱子,放了
j' role="presentation" style="position: relative;">j
j種東西的方案數,然後最後的答案就是∑m
in(n
,k)i
=1f[
k][i
]×2n
−i∑ i=
1min
(n,k
)f[k
][i]
×2n−
i。為什麼呢?舉個例子,比如k=
3 k=3
,n=4 n=4
,此時三個箱子放的分別是
112 112
,那麼選出的集合就有可能是、、
、,也就是只要至少含有
,那麼剩下的n−
i n−i
個選不選都無所謂,也就是2n
−i2 n−
i。
#include
using
namespace
std;
#define ll long long
#define pa pair
const
int mod=1e9+7;
const
int maxk=5010;
ll read()
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}ll n,k;
ll pow(ll x,ll y)
int f[2][maxk];
int main()
ll ans=0;
for(int i=1;i<=min(n,k);i++)ans=(ans+f[now][i]*pow(2ll,n-i)%mod)%mod;
printf("%i64d",ans);
}
Codeforces 817B 模擬 組合數
題目不難理解,就是給你乙個序列,然後讓你找到三個數相乘的最小值,問這有多少種組合情況。明顯一道考組合數的題 思路不難想,但是坑點比較多。我們先sort排序,然後計算出,最小的有多少個,次小的有多少個,次次小的有多少個。坑點一,有四種情況 情況一 最小的個數mi n1 min 1 3,那麼ans c3...
codeforces 1194F 組合數學
傳送門 你有n個事件,你需要按照1 n的順序完成這些事件,每個事件需要 t i 的時間完成,你現在一共有t的時間去做這些事情,每做一件事情的時候,你有0.5的概率花費 t i 的時間完成他,也有0.5的概率花費 t i 1 的時間去完成他,如果在做這個事件的時候時間花完了,你就相當於沒有做成這個事件...
Codeforces 1312D 組合數學
題意 給你n n n和m m m,問滿足以下條件的數列的個數 思路 數列有且僅有一對相等的數,所以每次要從m個數中挑n 1個數,既是組合數cn 1m。當找到n 1個數的時候,要滿足先嚴格遞增後嚴格遞減,嚴格遞增或嚴格遞減,所以最大值要確定在中間,我們只需要確定最大值兩邊的數即可,因為要存在一對相等的...