YbtOJ#20067-[NOIP2020模拟赛B组Day5]糖果分配【dp】
生活随笔
收集整理的這篇文章主要介紹了
YbtOJ#20067-[NOIP2020模拟赛B组Day5]糖果分配【dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:http://noip.ybtoj.com.cn/contest/102/problem/1
題目大意
nnn個xix_ixi?在[li,ri][l_i,r_i][li?,ri?]中隨機選擇,給出一個ccc,一個序列∑ki=c\sum k_i=c∑ki?=c
每種方案貢獻為∏i=1nxiki\prod_{i=1}^nx_i^{k_i}i=1∏n?xiki??
解題思路
設fi,jf_{i,j}fi,j?表示到第iii個小朋友,ccc已經分配了jjj出去時的貢獻和
fi,j=∑k=0j(fi,k+∑z=lirizj?k)f_{i,j}=\sum_{k=0}^j(f_{i,k}+\sum_{z=l_i}^{r_i}z^{j-k})fi,j?=k=0∑j?(fi,k?+z=li?∑ri??zj?k)
然后預處理后面那個東西的前綴和即可,時間復雜度O(nc2)O(nc^2)O(nc2)
解題思路
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=410,XJQ=1e9+7; ll n,c,l[N],r[N],f[N][N],z[N][N],ans; signed main() {freopen("candy.in","r",stdin);freopen("candy.out","w",stdout);scanf("%lld%lld",&n,&c);for(ll i=1;i<=n;i++)scanf("%lld",&l[i]);for(ll i=1;i<=n;i++)scanf("%lld",&r[i]);for(ll i=1;i<=400;i++){z[i][0]=1;for(ll j=1;j<=400;j++)z[i][j]=z[i][j-1]*i%XJQ;}for(ll i=0;i<=400;i++)for(ll j=1;j<=400;j++)(z[j][i]+=z[j-1][i])%=XJQ;f[0][0]=1;for(ll i=1;i<=n;i++)for(ll j=0;j<=c;j++)for(ll k=j;k<=c;k++)(f[i][k]+=f[i-1][j]*(z[r[i]][k-j]-z[l[i]-1][k-j])%XJQ)%=XJQ;printf("%lld",(f[n][c]+XJQ)%XJQ); }總結
以上是生活随笔為你收集整理的YbtOJ#20067-[NOIP2020模拟赛B组Day5]糖果分配【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF438D-The Child and
- 下一篇: 怎样煮板栗才能好剥壳 栗子易剥壳的煮法