设相邻两项的差值为a[i]=A[i+1]-A[i],因为第一天股价多少是不知道的,就=n-a[1]-a[2]..a[k-1],而对于每一个a[i]又有1到m种选择,于是就是所有的序列加起来,把n拆出来 n*m^k-1 - 后面序列的所有数,后面是有m^(k-1)(k-1)的数,但m个数均出现相等的次数,则每个数均出现m^(k-2)(k-1),m个数的和公式得综合为n*m^(k-1)-m(m+1)/2*m^(k-2)*(k-1)
#include<cstdio>
long long n,k,m,mod,ans;
void prework()
{
scanf("%lld%lld%lld%lld",&n,&k,&m,&mod);
}
long long quickpow(long long a,long long b)
{
long long ans=1,cnt=a;
while(b>0)
{
if(b%2)
ans=(ans*cnt)%mod;
cnt=(cnt*cnt)%mod;
b=b/2;
}
return ans;
}
void mainwork()
{
long long jian;
ans=n%mod;
ans=(ans*quickpow(m,k-1))%mod;
jian=((m+1)*m/2)%mod;
jian=(jian*quickpow(m,k-2))%mod;
jian=(jian*(k-1))%mod;
ans=(ans-jian)%mod;
if(ans<0)
ans+=mod;
}
void print()
{
printf("%lld",ans);
}
int main()
{
prework();
mainwork();
print();
return 0;
}