codeforce 891 E

题链

资瓷,日常不打数学公式,扔个链接:传送门

扔个trick,生成函数的X可以是多项式,而且可以连续域的卷积。(平时的fft是离散的。)

狄雷克卷积可不可以我不知道,有大佬知道请告诉我一下。

#include<bits/stdc++.h>
#define N 5005
#define sight(x) ('0'<=x&&x<='9')
#define mo 1000000007
using namespace std;
#define LL long long
int n,K,m,ans,a[N],f[N][N];
inline void read(int &x){
    static char c;
    for (c=getchar();!sight(c);c=getchar());
    for (x=0;sight(c);c=getchar())x=x*10+c-48;
}
void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('\n'); }
inline void writel(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar(' '); }
LL qsm(LL x,int y){
    static LL anw;
    for (anw=1;y;y>>=1,x=x*x%mo) if (y&1) anw=anw*x%mo; return anw;
}
int main(){
    read(n); read(K);
    for (int i=1;i<=n;i++) read(a[i]);
    f[0][0]=1;
    for (int i=1;i<=n;i++){
        f[i][0]=(LL)f[i-1][0]*a[i]%mo;
        for (int j=1;j<=i;j++) f[i][j]=((LL)f[i-1][j]*a[i]-f[i-1][j-1])%mo;
    }
    for (int i=0;i<=min(n,K);i++){
        int calc=1;
        for (int j=K-i+1;j<=K;j++) calc=(LL)calc*j%mo;
        ans=(ans+(LL)f[n][i]*qsm(n,K-i)%mo*calc)%mo;
    }
    ans=(LL)ans*qsm(qsm(n,K),mo-2)%mo;
    m=1;
    for (int i=1;i<=n;i++) m=(LL)m*a[i]%mo; ans=(m-ans)%mo;
    if (ans<0) ans+=mo;
    writeln(ans);
    return 0;
}

 

posted @ 2018-01-24 19:36  泪寒之雪  阅读(186)  评论(0编辑  收藏  举报