NC15871. 操作数
描述
输入描述
第一行两个整数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; }