zoukankan      html  css  js  c++  java
  • CF891E Lust

    若随机选择为第 (x) 个数,得其对答案的贡献为:

    [large prod_{i eq x}a_i=prod_{i}a_i-(a_x-1)prod_{i eq x}a_i ]

    (b_i) 为第 (i) 个数被选择的次数,考虑差分,得最终答案为:

    [large prod_{i}a_i-prod_{i}(a_i-b_i) ]

    由题意得 (sumlimits_{i}b_i=k),最终答案的期望为:

    [large prod_{i}a_i-frac{1}{n^k}frac{k!}{prodlimits_{i}b_i!}prod_i (a_i-b_i)=prod_{i}a_i-frac{k!}{n^k}prod_i frac{a_i-b_i}{b_i!} ]

    构造 (EGF),得:

    [large prod_{i}sum_jfrac{a_i-j}{j!}x^j=prod_{i}(a_i-x)e^x=e^{nx}prod_{i}(a_i-x) ]

    (left[x^k ight]e^{nx}prodlimits_{i}(a_i-x)) 即为所求,发现第二项为 (n) 次多项式,于是就可以 (O(n^2)) 计算该多项式的第 (k) 项了。

    #include<bits/stdc++.h>
    #define maxn 5010
    #define p 1000000007
    using namespace std;
    typedef long long ll;
    template<typename T> inline void read(T &x)
    {
        x=0;char c=getchar();bool flag=false;
        while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
        while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
        if(flag)x=-x;
    }
    ll n,k,val=1,ans;
    ll f[maxn],inv[maxn];
    int main()
    {
        read(n),read(k),inv[1]=f[0]=1;
        for(int i=2;i<=n;++i) inv[i]=(p-p/i)*inv[p%i]%p;
        for(int i=1,v;i<=n;++i)
        {
            read(v);
            for(int j=i;j>=1;--j) f[j]=(f[j]*v%p-f[j-1]+p)%p;
            f[0]=f[0]*v%p;
        }
        for(int i=0;i<=n;++i) ans=(ans+f[i]*val%p)%p,val=val*(k-i)%p*inv[n]%p;
        printf("%lld",(f[0]-ans+p)%p);
        return 0;
    }
    
  • 相关阅读:
    django 中 slice 和 truncatewords 不同用法???
    js如何获取到select的option值???
    MySQL的btree索引和hash索引的区别
    Python3之Django Web框架中间件???
    2019.07.25考试报告
    2019.07.19考试报告
    2019.07.18考试报告
    2019.07.16考试报告
    2019.07.12考试报告
    ELK+Kafka
  • 原文地址:https://www.cnblogs.com/lhm-/p/14347413.html
Copyright © 2011-2022 走看看