题解 [51nod1161] Partial Sums
Posted zsq259
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 [51nod1161] Partial Sums相关的知识,希望对你有一定的参考价值。
解析
我们设\(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的主要内容,如果未能解决你的问题,请参考以下文章