【XSY2032】简单粗暴的题目 组合数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ez_yww/article/details/79089354

题目描述

  给你n,k,a1an,设

ansn=i=1n(j=ins(j))k

  求ans1ansn

  对109+7取模

  n50000,k100

题解

  大水题

  这题就是在搞笑

  题解的做法是O(nklogk)

  随便推推就能推出O(nk)的做法

ansn=i=1n(j=ins(j))k=i=1n(snsi1)k=i=1nj=0ksnjsi1kj(1)kj(kj)=i=0ksni(1)ki(ki)j=1nsj1ki

  维护最后那项即可。

  时间复杂度:O(nk)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll p=1000000007;
ll c[110][110];
ll a[50010];
ll s[50010];
ll b[50010];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("xsy2032.in","r",stdin);
    freopen("xsy2032.out","w",stdout);
#endif
    int n,k;
    scanf("%d%d",&n,&k);
    int i,j;
    memset(c,0,sizeof c);
    for(i=0;i<=k;i++)
    {
        c[i][0]=1;
        for(j=1;j<=i;j++)
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%p;
    }
    b[0]=1;
    s[0]=1;
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        a[i]=(a[i]+a[i-1])%p;
        for(j=1;j<=k;j++)
            b[j]=b[j-1]*a[i]%p;
        ll ans=0;
        for(j=0;j<=k;j++)
            ans=(ans+b[j]*s[k-j]%p*c[k][j]%p*((k-j)&1?-1:1))%p;
        ans=(ans+p)%p;
        printf("%lld\n",ans);
        for(j=0;j<=k;j++)
            s[j]=(s[j]+b[j])%p;
    }
    return 0;
}
展开阅读全文

没有更多推荐了,返回首页