数列

题目描述

小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨。

股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N。在疯涨的K天中小T观察到:除第一天外每天的股价都比前一天高,且高出的价格(即当天的股价与前一天 的股价之差)不会超过M,M为正整数。并且这些参数满足m×(k−1)<n。

小T忘记了这K天每天的具体股价了,他现在想知道这K天的股价有多少种可能。

题解

考虑到一个m序列,它对答案的贡献就是n−∑1n−1ain-\sum_1^{n-1} a_in1n1ai所以答案变成n∗mk−1−∑排列∑ain*m^{k-1}-\sum排列\sum a_inmk1ai,接着考虑到后面这个aia_iai一共出现了(k−1)∗n∗mk−1(k-1)*n*m^{k-1}(k1)nmk1次,每个数出现的次数又都一样,所以每个数出现了(k−1)∗n∗mk−2(k-1)*n*m^{k-2}(k1)nmk2次,然后就是∑i∗(k−1)∗n∗mk−2\sum i*(k-1)*n*m^{k-2}i(k1)nmk2 所以总式n∗mk−1−m∗(m+1)/2∗i∗(k−1)∗n∗mk−2n*m^{k-1}-m*(m+1)/2*i*(k-1)*n*m^{k-2}nmk1m(m+1)/2i(k1)nmk2
##代码

#include <cstdio>
#define LL long long
LL n,k,m,p;
LL Pow(LL x,LL k){
    LL res=1;
    while(k){
        if(k&1) res=res*x%p;
        x=x*x%p; k>>=1ll;
    }
    return res;
}
int main(){
    scanf("%lld%lld%lld%lld",&n,&k,&m,&p);
    printf("%lld",((n%p*Pow(m,k-1)%p-Pow(m,k-2)%p*(k-1)%p*(m*(m+1)/2%p)%p+p)%p));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jarden_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值