1425: 数列(seq)

题目描述

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

题解

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

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值