/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL n, k, m, p;
inline LL qpow(LL a, LL n) {
LL res = 1;
for(; n; n >>= 1, a = a * a % p) if(n & 1) res = res * a % p;
return res;
}
int main() {
scanf("%lld%lld%lld%lld", &n, &k, &m, &p);
printf("%lld\n", k == 1 ? n % p : (n % p * qpow(m, k - 1) % p - m * (m + 1) / 2 % p * qpow(m, k - 2) % p * (k - 1) % p + p) % p);
return 0;
}
【BZOJ3142】[Hnoi2013]数列【组合数学】
最新推荐文章于 2018-11-24 11:55:00 发布