码迷,mamicode.com
首页 > 其他好文 > 详细

codeforce 891 E

时间:2018-01-24 22:29:28      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:com   putc   long   getc   生成   tar   put   code   efi   

题链

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

扔个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;
}

 

codeforce 891 E

标签:com   putc   long   getc   生成   tar   put   code   efi   

原文地址:https://www.cnblogs.com/rrsb/p/8343218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!