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

题解 [51nod1161] Partial Sums

时间:2019-08-25 20:10:54      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:partial   read   printf   ==   pac   hal   space   cpp   namespace   

题面

解析

我们设\(f[i]\)表示\(k\)次操作后第一个数在第\(i\)个位置上加了多少次,

而其它的数也可以类推,

\(i\)个数在第\(j\)个位置加的次数就是\(f[j-i+1]\).

通过找规律手玩样例后可以发现,

\(f[i]=C_{i+k-2}^{i-1}\).

(然而并不知道为什么)

最后对每个位置统计贡献就行了.

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#define int long long
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;

inline int read(){
    int sum=0,f=1;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    return f*sum;
}

const int N=5005;
int Mod=1000000007;
int n,K,a[N],f[N];
int jc[N]={1};

inline int fpow(int a,int b){
    int ret=1;
    while(b){
        if(b&1) ret=ret*a%Mod;
        a=a*a%Mod;b>>=1;
    }
    return ret;
}

inline int inv(int x){
    return fpow(x,Mod-2);
}

inline int C(int n,int m){
    int ret=1;
    for(int i=n-m+1;i<=n;i++) ret=ret*i%Mod;
    return ret*inv(jc[m])%Mod;
}

signed main(){
    n=read();K=read();
    for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%Mod;
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=1;i<=n;i++) f[i]=C(i+K-2,i-1);
    for(int i=1;i<=n;i++){
        int ret=0;
        for(int j=1;j<=i;j++){
            ret=(ret+a[j]*f[i-j+1]%Mod)%Mod;
        }
        printf("%lld\n",ret);
    }
    return 0;
}

题解 [51nod1161] Partial Sums

标签:partial   read   printf   ==   pac   hal   space   cpp   namespace   

原文地址:https://www.cnblogs.com/zsq259/p/11408822.html

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