列表

详情


NC15871. 操作数

描述

给定长度为n的数组a,定义一次操作为:
1. 算出长度为n的数组s,使得si= (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个整数表示答案。

示例1

输入:

3 1
1 2 3

输出:

1 3 6

示例2

输入:

5 0
3 14 15 92 6

输出:

3 14 15 92 6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 16ms, 内存消耗: 612K, 提交时间: 2018-05-05 10:18:31

#include<bits/stdc++.h>
using namespace std;
const int MD=1e9+7;
typedef long long ll;
ll n,k,a[2000],b[2000],c[2000];
int INV(ll x) { return x==1?x:1LL*(MD-MD/x)*INV(MD%x)%MD; }
int main()
{
    cin>>n>>k;
    for(int i=0; i<n; i++)cin>>a[i];
    b[0]=1;
    for(int i=1; i<n; i++)
        b[i]=b[i-1]*(k+i-1)%MD*INV(i)%MD;
    for(int i=0; i<n; i++)
        for(int j=0; j<=i; j++)
            c[i]=(c[i]+a[j]*b[i-j])%MD;
    for(int i=0; i<n; i++)
    cout<<c[i]<<(i==n-1?"\n":" ");
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 16ms, 内存消耗: 604K, 提交时间: 2019-09-19 17:13:04

#include<bits/stdc++.h>
using namespace std;
typedef long long l;
typedef int I;
const I M=1e9+7;
l n,k,a[2000],b[2000],c[2000];
I f(l x) { return x==1?x:1LL*(M-M/x)*f(M%x)%M; }
I main()
{
    cin>>n>>k;
    for(I i=0; i<n; i++)cin>>a[i];
    b[0]=1;
    for(I i=1; i<n; i++)b[i]=b[i-1]*(k+i-1)%M*f(i)%M;
    for(I i=0; i<n; i++)for(I j=0; j<=i; j++)c[i]=(c[i]+a[j]*b[i-j])%M;
    for(I i=0; i<n; i++)
    cout<<c[i]<<" \n"[i==n-1];
    return 0;
}

上一题