题目描述
小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨。
股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N。在疯涨的K天中小T观察到:除第一天外每天的股价都比前一天高,且高出的价格(即当天的股价与前一天 的股价之差)不会超过M,M为正整数。并且这些参数满足m×(k−1)<n。
小T忘记了这K天每天的具体股价了,他现在想知道这K天的股价有多少种可能。
题解
答案即为差值为个数,每个数在的范围内的每个数列的贡献
对于一个数列,它的贡献为
考虑到一个数列,必然存在另一个数列,其每一位相加都为
所以两两配对起来,又因为一共有种数列,所以答案为:
#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%p*K(m,k-1)%p-(m*(m+1)/2)%p*(k-1)%p*K(m,k-2)%p+p)%p);
return 0;
}