[概率期望DP]JZOJ 4212 我想大声告诉你
分析
我想大声挖倍内听!吔X啦梁非凡!
内!我要炒内啊!
↑这是我看到题目一瞬间脑补的
这题意有个等价的方法
就是第i次游戏选第i个人,第i个人未出局就出局,并且使后面i+1~n个人有p概率出局,已出局就不管
其实是一样的
那么可以写DP
设f[i][j]为选第i个人前,1~i-1有j个人被点出局了
那么状态转移显然:
1、f[i+1][j+1]+=f[i][j]*((y-x)/y)^(j+1)(i被点掉了)
2、f[i+1][j]+=f[i][j]*(x/y)^(j)(i刚好没了)
最后求和除个n就行
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; typedef long long ll; const int P=258280327; const int N=2e3+10; int T,n; ll x,y,ny[N],f[N][N]; ll Power(ll x,ll y) {ll ans=1;for (;y;y>>=1,(x*=x)%=P) if (y&1) (ans*=x)%=P;return ans;} int main() { for (scanf("%d",&T);T;T--) { scanf("%d%lld%lld",&n,&x,&y); ll cy=Power(y,P-2);ny[0]=1;memset(f,0,sizeof f);f[1][0]=1; for (int i=1;i<=n;i++) ny[i]=ny[i-1]*(y-x)%P*cy%P; for (int i=1;i<n;i++) for (int j=0;j<i;j++) if (f[i][j]) (f[i+1][j+1]+=f[i][j]*ny[j+1]%P)%=P,(f[i+1][j]+=f[i][j]*(1-ny[j]+P)%P)%=P; for (int i=0;i<n;i++) { ll lans=0; for (int j=1;j<=n;j++) (lans+=f[j][i])%=P; printf("%lld ",lans*Power(n,P-2)%P); } printf("\n"); } }
在日渐沉没的世界里,我发现了你。