链接:
https://www.nowcoder.com/acm/contest/109/C
来源:牛客网
来源:牛客网
题目描述
给定长度为n的数组a,定义一次操作为:
1. 算出长度为n的数组s,使得s i= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007;
2. 执行a = s;
现在问k次操作以后a长什么样。
1. 算出长度为n的数组s,使得s i= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007;
2. 执行a = s;
现在问k次操作以后a长什么样。
输入描述:
第一行两个整数n,k(1 <= n <= 2000, 0 <= k <= 1,000,000,000); 第二行n个整数表示a数组(0 <= ai<= 1,000,000,000)。
输出描述:
一行n个整数表示答案。
题解:直接打表找规律,然后发现每一位之前对自己这一位的贡献是:
C(k,1)、C(K+1,2)、。。。C(k+n-2,n-2),然后暴力乘即可。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define mod 1000000007
ll n,k,a[2005],ans[2005],cnt;
ll q(ll x,ll y)
{
ll res=1ll;
while(y)
{
if(y%2)
res=res*x%mod;
x=x*x%mod;
y/=2;
}
return res;
}
ll work(ll x,ll y)
{
cnt=cnt*x%mod*q(y,mod-2)%mod;
return cnt;
}
int main(void)
{
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
ans[i]=a[i];ll p=i-1,num=1;cnt=1ll;
for(ll j=k;j<=k+i-2;j++)
ans[i]=(ans[i]+work(j,num)*a[p]%mod)%mod,p--,num++;
}
for(int i=1;i<n;i++)
printf("%lld ",ans[i]);
printf("%lld\n",ans[n]);
return 0;
}