[CF850F] Rainbow Balls
生活随笔
收集整理的這篇文章主要介紹了
[CF850F] Rainbow Balls
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
題目描述
給定 nnn 種顏色的球,每種球有 aia_iai? 個,對這些球執行以下操作:
- 有順序地任意取兩個球,將第二個球涂上第一個球的顏色,重復該操作至所有球顏色相同。
求期望操作次數,對 109+710^9+7109+7 取模。
數據范圍:n≤2500n\le 2500n≤2500,1≤ai≤1051\le a_i\le 10^51≤ai?≤105。
Solution
- 設 fif_ifi? 表示當前有 iii 個球,將所有球變為該顏色的期望次數,sss 表示球的總數,ppp 表示當前取出的兩個球第一個與最終顏色相同,第二個與最終顏色不同的概率。
根據題意,有 p=i×(s?i)s×(s?1)p=\frac{i\times(s-i)}{s\times(s-1)}p=s×(s?1)i×(s?i)?fi=p×fi?1+p×fi+1+(1?2p)×fi+vf_i=p\times f_{i-1}+p\times f_{i+1}+(1-2p)\times f_i+vfi?=p×fi?1?+p×fi+1?+(1?2p)×fi?+v其中 vvv 為這一步操作對最終答案的貢獻,也就是該顏色成為最終顏色的概率。 - 設 gig_igi? 表示當前顏色成為最終顏色的概率,有 g0=0g_0=0g0?=0,g1=1g_1=1g1?=1,且 gi=p×gi?1+p×gi+1+(1?2p)×gig_{i}=p\times g_{i-1}+p\times g_{i+1}+(1-2p)\times g_igi?=p×gi?1?+p×gi+1?+(1?2p)×gi?。
轉化可得 gi?gi?1=gi+1?gig_i-g_{i-1}=g_{i+1}-g_{i}gi??gi?1?=gi+1??gi?,等差數列求和可得 gi=isg_i=\frac{i}{s}gi?=si?,即 v=isv=\frac{i}{s}v=si?。 - 那么現在有fi=p×fi?1+p×fi+1+(1?2p)×fi+isf_i=p\times f_{i-1}+p\times f_{i+1}+(1-2p)\times f_i+\frac{i}{s}fi?=p×fi?1?+p×fi+1?+(1?2p)×fi?+si?轉化后有fi?fi+1=fi?1?fi+s?1s?if_{i}-f_{i+1}=f_{i-1}-f_{i}+\frac{s-1}{s-i}fi??fi+1?=fi?1??fi?+s?is?1?
- 考慮求 f1f_1f1? 和 f2f_2f2? 后線性遞推,由于 f0f_0f0? 不存在,代入后有 f2=2f1?1f_2=2f_1-1f2?=2f1??1。
f1=f1?fs=∑i=2sfi?1?fi=(s?1)×(f1?f2)+∑i=2s?1s?1s?i×(s?i)=(s?1)×(1?f1)+(s?1)×(s?2)\begin{aligned}f_1&=f_1-f_s\\ &=\sum_{i=2}^{s}{f_{i-1}-f_{i}}\\ &=(s-1)\times(f_1-f_2)+\sum_{i=2}^{s-1}{\frac{s-1}{s-i}\times(s-i)}\\&=(s-1)\times(1-f_1)+(s-1)\times(s-2)\end{aligned}f1??=f1??fs?=i=2∑s?fi?1??fi?=(s?1)×(f1??f2?)+i=2∑s?1?s?is?1?×(s?i)=(s?1)×(1?f1?)+(s?1)×(s?2)? - 所以f1=(s?1)2sf_1=\frac{(s-1)^2}{s}f1?=s(s?1)2?線性遞推即可求解,答案為 ∑i=1nfai\sum_{i=1}^{n}{f_{a_{i}}}∑i=1n?fai??。
Code
#include<cstdio> using namespace std; const int maxn=100010,MLY=1000000007; int f[maxn],n,a[maxn],s,ans; inline int power(int a,int b){int ans=1;while(b){if(b&1)ans=1ll*ans*a%MLY;a=1ll*a*a%MLY;b>>=1;}return ans; } int main(){scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&a[i]),s+=a[i];f[1]=(s-1ll)*(s-1)%MLY*power(s,MLY-2)%MLY;f[2]=(2ll*f[1]-1+MLY)%MLY;for(int i=2;i<100000;++i)f[i+1]=((2ll*f[i]-f[i-1]-(s-1ll)*power(s-i,MLY-2))%MLY+MLY)%MLY;for(int i=1;i<=n;++i)ans=(ans+f[a[i]])%MLY;printf("%d",ans);return 0; }總結
以上是生活随笔為你收集整理的[CF850F] Rainbow Balls的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用程序并行配置不正确或错误的解决方法应
- 下一篇: 让自己人生观更清晰让自己人生观更清晰的书