52nod 1670打怪獸 期望dp

2021-10-24 19:44:20 字數 1050 閱讀 5206

定義dp[

i]

dp[i]

dp[i

]為能量為i

ii時可行的方案數

那麼顯然dp[

0]=n

!dp[0]=n!

dp[0]=

n! dp[

i]=(

a[i−

1]−i

+1)/

(n−i

+1

)dp[i]=(a[i-1]-i+1)/(n-i+1)

dp[i]=

(a[i

−1]−

i+1)

/(n−

i+1)

其中i−

1i-1

i−1是已經殺死的敵人個數

a [i

−1

]a[i-1]

a[i−1]

表示怪物的字首和,也就是能殺死的怪物總數

#include using namespace std;

#define int long long

const int mod=1e9+7;

const int maxn=2e5+10;

int n,m,dp[maxn],a[maxn];

int quick_pow(int x,int n)

return ans;

}int inv(int x)

signed main()

int fac=1;

for(int i=1;i<=n;i++) fac*=i,fac%=mod;

for(int i=1;i<=n;i++) a[i]+=a[i-1];

dp[0]=fac;

for(int i=1;i<=n;i++)

dp[i]=dp[i-1]*(a[i-1]-i+1)%mod*inv(n-i+1)%mod;

//有a[i-1]-(i-1)個怪物可以打

int ans=0;

for(int i=0;i<=n;i++)

cout << ans;

}