1425: 数列(seq)

题目描述

小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨。
股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N。在疯涨的K天中小T观察到:除第一天外每天的股价都比前一天高,且高出的价格(即当天的股价与前一天 的股价之差)不会超过M,M为正整数。并且这些参数满足m×(k−1)<n。
小T忘记了这K天每天的具体股价了,他现在想知道这K天的股价有多少种可能。

题解

答案即为差值为k1k-1个数,每个数在1m1-m的范围内的每个数列的贡献
对于一个数列,它的贡献为nain-\sum a_i
考虑到一个数列,必然存在另一个数列,其每一位相加都为m+1m+1
所以两两配对起来,又因为一共有mk1m^{k-1}种数列,所以答案为:
mk1(n(m+1)(k1)2)m^{k-1}*(n-\frac{(m+1)*(k-1)}{2})

#include <cstdio>
#define LL long long
LL n,k,m,p;
LL K(LL x,LL y){
    LL A=1;while(y){
        if (y&1) A=A*x%p;
        x=x*x%p;y>>=1;
    }return A;
}
int main(){
    scanf("%lld%lld%lld%lld",&n,&k,&m,&p);
    printf("%lld\n",(n%p*K(m,k-1)%p-(m*(m+1)/2)%p*(k-1)%p*K(m,k-2)%p+p)%p);
    return 0;
}
posted @ 2018-11-07 21:01  xjqxjq  阅读(152)  评论(0编辑  收藏  举报