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