51NOD 1161 Partial Sums(数论)

传送门
给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}。如果对生成的数组S再进行一次累加操作,{1 4 9 15} => {1 5 14 29},现在给出数组A,问进行K次操作后的结果。(每次累加后的结果 mod 10^9 + 7)
Input
第1行,2个数N和K,中间用空格分隔,N表示数组的长度,K表示处理的次数(2 <= n <= 5000, 0 <= k <= 10^9, 0 <= a[i] <= 10^9)
Output
共N行,每行一个数,对应经过K次处理后的结果。每次累加后mod 10^9 + 7。
Input示例
4 2
1
3
5
6
Output示例
1
5
14
29

解题思路:
找规律。。。

a[i]1

k=0 a[1]=1 a[2]=1 a[3]=1 a[4]=1

k=1 a[1]=1 a[2]=2 a[3]=3 a[4]=4

k=2 a[1]=1 a[2]=3 a[3]=6 a[4]=10

然后再多写几组数据就会发现一些规律: Sn=ni=1(Xnia[i])

Xni=C(k1+nik1)

其中用到了组合数的一些公式:

C(n+1,m)=C(n,m)(n+1)/(n+1m)
My Code

/**
2016 - 08 - 11 上午
Author: ITAK

Motto:

今日的我要超越昨日的我,明日的我要胜过今日的我,
以创作出更好的代码为目标,不断地超越自己。
**/

#include <iostream>
#include <cstdio>
#include <cstring> 
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 1e9+5;
const int MAXN = 5e3+5;
const LL MOD = 1e9+7;
const double eps = 1e-7;
const double PI = acos(-1);
using namespace std;
LL a[MAXN], Inv[MAXN];
void Get_Inv()
{
    Inv[1] = 1;
    for(int i=2; i<MAXN; i++)
        Inv[i] = ( (MOD-MOD/i)*Inv[MOD%i] ) % MOD;
}
LL ans[MAXN];
void Init(int n, int k)
{
    ans[0] = 1;
    for(int i=1; i<=n; i++)
        ans[i] = ( (ans[i-1]*(k-1+i)%MOD) * Inv[i]) % MOD;
}
int main()
{
    Get_Inv();
    int n, k;
    while(~scanf("%d%d",&n,&k))
    {
        for(int i=1; i<=n; i++)
            scanf("%I64d",&a[i]);
        Init(n, k);
        for(int i=1; i<=n; i++) 
        {
            LL sum = 0;
            for(int j=1; j<=i; j++)
                sum = (sum+ans[i-j]*a[j]%MOD+MOD) % MOD;
            if(i == n)
                printf("%I64d ",sum);
            else
                printf("%I64d\n",sum);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值