[CF891E]Lust

51 篇文章 0 订阅
25 篇文章 0 订阅

题目大意

一个序列a,做k次下列操作:
1、随机一个下标x,答案加上 Πni=1,i!=xai
2、将 ax 减一。
求答案的期望。

做法

bi 表示最终 ai 减少了多少次。
答案是 Πni=1aiΠni=1(aibi)
E(Πni=1aiΠni=1(aibi))=Πni=1aik!ni=1bi=kΠni=1(aibi)bi!nk
只考虑计算后面部分。
F(x)=Πni=1j>=0xj(aij)j!
这是后面那个东西的生成函数。
F(x)=Πni=1ex(aix)
F(x)=enxΠni=1(aix)
对于后面部分我们暴力展开得到 ni=0cixi
现在 [xk]F(x)=ni=0cinki(ki)!
代入原式得到 ni=0ciΠkj=ki+1jni

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=5000+10,mo=1000000007;
int c[maxn],d[maxn],a[maxn];
int i,j,k,l,t,n,m,ni,num,ans;
int qsm(int x,int y){
    if (!y) return 1;
    int t=qsm(x,y/2);
    t=(ll)t*t%mo;
    if (y%2) t=(ll)t*x%mo;
    return t;
}
int main(){
    scanf("%d%d",&n,&k);
    c[0]=1;
    fo(i,1,n){
        scanf("%d",&a[i]);
        fo(j,0,i) d[j]=0;
        fo(j,0,i-1){
            (d[j]+=(ll)c[j]*a[i]%mo)%=mo;
            (d[j+1]-=c[j])%=mo;
        }
        fo(j,0,i) c[j]=d[j];
    }
    ni=qsm(n,mo-2);
    num=1;
    fo(i,0,n){
        (ans+=(ll)c[i]*num%mo)%=mo;
        num=(ll)num*ni%mo*(k-i)%mo;
    }
    ans=(c[0]-ans)%mo;
    (ans+=mo)%=mo;
    printf("%d\n",ans);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值