#include <iostream>
#include <vector>
using namespace std;
const long long TheMod = 1e9 + 7;
long long power(long long base, long long exp) {
long long res = 1;
base %= TheMod;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % TheMod;
base = (base * base) % TheMod;
exp /= 2;
}
return res;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
long long n, k, m;
if (!(cin >> n >> k >> m)) return 0;
long long inv_k = power(k, TheMod - 2);
// prawdopodobieństwo p[x] że pojedynczy gracz wyląduje na x
vector<long long> p(m, 0);
p[0] = 1;
long long sum_p = 1;
for (int x = 1; x < m; ++x) {
p[x] = (sum_p * inv_k) % TheMod;
sum_p = (sum_p + p[x]) % TheMod;
if (x >= k) {
sum_p = (sum_p - p[x - k] + TheMod) % TheMod;
}
}
long long ans = 0;
long long current_P_death = 0;
for (long long x = 0; x < m; ++x) {
long long q = 0;
// Obliczenie czy z x da się przeskoczyć w jednym ruchu m
if (x >= m - k) {
q = (x + k - m + 1) * inv_k % TheMod;
}
if (x - 1 >= max(0LL, m - k)) {
long long z = x - 1;
long long prob_death_from_z = (z + k - m + 1) * inv_k % TheMod;
long long add = (p[z] * prob_death_from_z) % TheMod;
current_P_death = (current_P_death + add) % TheMod;
}
if (q == 0) {
long long term = (n * p[x]) % TheMod;
ans = (ans + term) % TheMod;
} else {
long long Sx = (1 - current_P_death + TheMod) % TheMod;
long long Sx_n = power(Sx, n);
long long sub = (Sx - (p[x] * q % TheMod) + TheMod) % TheMod;
long long sub_n = power(sub, n);
long long num = (Sx_n - sub_n + TheMod) % TheMod;
long long inv_q = power(q, TheMod - 2);
long long term = (num * inv_q) % TheMod;
ans = (ans + term) % TheMod;
}
}
cout << ans << "\n";
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <iostream> #include <vector> using namespace std; const long long TheMod = 1e9 + 7; long long power(long long base, long long exp) { long long res = 1; base %= TheMod; while (exp > 0) { if (exp % 2 == 1) res = (res * base) % TheMod; base = (base * base) % TheMod; exp /= 2; } return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); long long n, k, m; if (!(cin >> n >> k >> m)) return 0; long long inv_k = power(k, TheMod - 2); // prawdopodobieństwo p[x] że pojedynczy gracz wyląduje na x vector<long long> p(m, 0); p[0] = 1; long long sum_p = 1; for (int x = 1; x < m; ++x) { p[x] = (sum_p * inv_k) % TheMod; sum_p = (sum_p + p[x]) % TheMod; if (x >= k) { sum_p = (sum_p - p[x - k] + TheMod) % TheMod; } } long long ans = 0; long long current_P_death = 0; for (long long x = 0; x < m; ++x) { long long q = 0; // Obliczenie czy z x da się przeskoczyć w jednym ruchu m if (x >= m - k) { q = (x + k - m + 1) * inv_k % TheMod; } if (x - 1 >= max(0LL, m - k)) { long long z = x - 1; long long prob_death_from_z = (z + k - m + 1) * inv_k % TheMod; long long add = (p[z] * prob_death_from_z) % TheMod; current_P_death = (current_P_death + add) % TheMod; } if (q == 0) { long long term = (n * p[x]) % TheMod; ans = (ans + term) % TheMod; } else { long long Sx = (1 - current_P_death + TheMod) % TheMod; long long Sx_n = power(Sx, n); long long sub = (Sx - (p[x] * q % TheMod) + TheMod) % TheMod; long long sub_n = power(sub, n); long long num = (Sx_n - sub_n + TheMod) % TheMod; long long inv_q = power(q, TheMod - 2); long long term = (num * inv_q) % TheMod; ans = (ans + term) % TheMod; } } cout << ans << "\n"; return 0; } |
English