记
ai
为数列第
i+1
个数与数列第
i
个数之差。这时就能得出
而只要给定了这个差分数列和原数列的第
1
个数,就能确定整个原数列。同时也可以得出,一个差分数列对应了
由于
M(K−1)<N
,因此
N−∑K−1i=1ai>0
。
所以答案为
∑Ma1=1∑Ma2=1...∑MaK−1=1(N−∑K−1i=1ai)
,
把
N
移到外面去,得到:
考虑在所有的
MK−1
个差分数列中,对于任何的
1≤i≤M
且
1≤j<K
,数值
i
都作为
∑Ma1=1∑Ma2=1...∑MaK−1=1∑K−1i=1ai=M(M+1)2∗(K−1)MK−2
=(M+1)(K−1)MK−12
所以答案就是
NMK−1−(M+1)(K−1)MK−12
。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n; int K, m, ZZQ;
int qpow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = 1ll * res * a % ZZQ;
a = 1ll * a * a % ZZQ;
b >>= 1;
}
return res;
}
int main() {
int res, tmp; cin >> n >> K >> m >> ZZQ;
res = 1ll * (n % ZZQ) * qpow(m, K - 1) % ZZQ;
tmp = 1ll * (m + 1) * (K - 1) % ZZQ * qpow(m, K - 1) % ZZQ;
tmp = tmp & 1 ? tmp + ZZQ >> 1 : tmp >> 1;
cout << (res - tmp + ZZQ) % ZZQ << endl;
return 0;
}