#include <bits/stdc++.h>
using namespace std;
static const long long MOD = 1000000007LL;
long long szybkie_czarowanie(long long baza, long long wykladnik) {
long long wynik = 1;
while (wykladnik > 0) {
if (wykladnik & 1) wynik = wynik * baza % MOD;
baza = baza * baza % MOD;
wykladnik >>= 1;
}
return wynik;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int liczba_glodomorow, ile_scian_ma_kostka, prog_konca_imprezy;
cin >> liczba_glodomorow >> ile_scian_ma_kostka >> prog_konca_imprezy;
vector<long long> odwrotne_parowki(ile_scian_ma_kostka + 1, 0);
odwrotne_parowki[1] = 1;
for (int i = 2; i <= ile_scian_ma_kostka; i++) {
odwrotne_parowki[i] = MOD - (MOD / i) * odwrotne_parowki[MOD % i] % MOD;
}
long long odwrotna_kostka = szybkie_czarowanie(ile_scian_ma_kostka, MOD - 2);
vector<long long> szansa_na_dokladny_wynik(prog_konca_imprezy, 0);
szansa_na_dokladny_wynik[0] = 1;
long long garnek_zupy = 1;
for (int wynik_biedaka = 1; wynik_biedaka < prog_konca_imprezy; wynik_biedaka++) {
szansa_na_dokladny_wynik[wynik_biedaka] = garnek_zupy * odwrotna_kostka % MOD;
garnek_zupy += szansa_na_dokladny_wynik[wynik_biedaka];
if (garnek_zupy >= MOD) garnek_zupy -= MOD;
if (wynik_biedaka - ile_scian_ma_kostka >= 0) {
garnek_zupy -= szansa_na_dokladny_wynik[wynik_biedaka - ile_scian_ma_kostka];
if (garnek_zupy < 0) garnek_zupy += MOD;
}
}
int poczatek_strefy_bum = prog_konca_imprezy - ile_scian_ma_kostka;
int pierwsza_podejrzana_kolumna = max(0, poczatek_strefy_bum);
long long odpowiedz_wielkiego_szamana = 0;
for (int wynik_biedaka = 0; wynik_biedaka < pierwsza_podejrzana_kolumna; wynik_biedaka++) {
odpowiedz_wielkiego_szamana += 1LL * liczba_glodomorow * szansa_na_dokladny_wynik[wynik_biedaka];
if (odpowiedz_wielkiego_szamana >= MOD) odpowiedz_wielkiego_szamana %= MOD;
}
odpowiedz_wielkiego_szamana %= MOD;
vector<long long> ogon_nieszczescia(prog_konca_imprezy + 1, 0);
for (int wynik_biedaka = prog_konca_imprezy - 1; wynik_biedaka >= pierwsza_podejrzana_kolumna; wynik_biedaka--) {
int ile_rzutow_konczy = wynik_biedaka - poczatek_strefy_bum + 1;
long long szansa_ze_tu_juz_kaplica = szansa_na_dokladny_wynik[wynik_biedaka] * ile_rzutow_konczy % MOD * odwrotna_kostka % MOD;
ogon_nieszczescia[wynik_biedaka] = ogon_nieszczescia[wynik_biedaka + 1] + szansa_ze_tu_juz_kaplica;
if (ogon_nieszczescia[wynik_biedaka] >= MOD) ogon_nieszczescia[wynik_biedaka] -= MOD;
}
for (int wynik_biedaka = pierwsza_podejrzana_kolumna; wynik_biedaka < prog_konca_imprezy; wynik_biedaka++) {
int ile_rzutow_konczy = wynik_biedaka - poczatek_strefy_bum + 1;
long long lewy_kociolek = szybkie_czarowanie(ogon_nieszczescia[wynik_biedaka], liczba_glodomorow);
long long prawy_kociolek = szybkie_czarowanie(ogon_nieszczescia[wynik_biedaka + 1], liczba_glodomorow);
long long roznica_kotletow = lewy_kociolek - prawy_kociolek;
if (roznica_kotletow < 0) roznica_kotletow += MOD;
long long dokladka = roznica_kotletow * ile_scian_ma_kostka % MOD * odwrotne_parowki[ile_rzutow_konczy] % MOD;
odpowiedz_wielkiego_szamana += dokladka;
if (odpowiedz_wielkiego_szamana >= MOD) odpowiedz_wielkiego_szamana -= MOD;
}
cout << odpowiedz_wielkiego_szamana % MOD << '\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 | #include <bits/stdc++.h> using namespace std; static const long long MOD = 1000000007LL; long long szybkie_czarowanie(long long baza, long long wykladnik) { long long wynik = 1; while (wykladnik > 0) { if (wykladnik & 1) wynik = wynik * baza % MOD; baza = baza * baza % MOD; wykladnik >>= 1; } return wynik; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int liczba_glodomorow, ile_scian_ma_kostka, prog_konca_imprezy; cin >> liczba_glodomorow >> ile_scian_ma_kostka >> prog_konca_imprezy; vector<long long> odwrotne_parowki(ile_scian_ma_kostka + 1, 0); odwrotne_parowki[1] = 1; for (int i = 2; i <= ile_scian_ma_kostka; i++) { odwrotne_parowki[i] = MOD - (MOD / i) * odwrotne_parowki[MOD % i] % MOD; } long long odwrotna_kostka = szybkie_czarowanie(ile_scian_ma_kostka, MOD - 2); vector<long long> szansa_na_dokladny_wynik(prog_konca_imprezy, 0); szansa_na_dokladny_wynik[0] = 1; long long garnek_zupy = 1; for (int wynik_biedaka = 1; wynik_biedaka < prog_konca_imprezy; wynik_biedaka++) { szansa_na_dokladny_wynik[wynik_biedaka] = garnek_zupy * odwrotna_kostka % MOD; garnek_zupy += szansa_na_dokladny_wynik[wynik_biedaka]; if (garnek_zupy >= MOD) garnek_zupy -= MOD; if (wynik_biedaka - ile_scian_ma_kostka >= 0) { garnek_zupy -= szansa_na_dokladny_wynik[wynik_biedaka - ile_scian_ma_kostka]; if (garnek_zupy < 0) garnek_zupy += MOD; } } int poczatek_strefy_bum = prog_konca_imprezy - ile_scian_ma_kostka; int pierwsza_podejrzana_kolumna = max(0, poczatek_strefy_bum); long long odpowiedz_wielkiego_szamana = 0; for (int wynik_biedaka = 0; wynik_biedaka < pierwsza_podejrzana_kolumna; wynik_biedaka++) { odpowiedz_wielkiego_szamana += 1LL * liczba_glodomorow * szansa_na_dokladny_wynik[wynik_biedaka]; if (odpowiedz_wielkiego_szamana >= MOD) odpowiedz_wielkiego_szamana %= MOD; } odpowiedz_wielkiego_szamana %= MOD; vector<long long> ogon_nieszczescia(prog_konca_imprezy + 1, 0); for (int wynik_biedaka = prog_konca_imprezy - 1; wynik_biedaka >= pierwsza_podejrzana_kolumna; wynik_biedaka--) { int ile_rzutow_konczy = wynik_biedaka - poczatek_strefy_bum + 1; long long szansa_ze_tu_juz_kaplica = szansa_na_dokladny_wynik[wynik_biedaka] * ile_rzutow_konczy % MOD * odwrotna_kostka % MOD; ogon_nieszczescia[wynik_biedaka] = ogon_nieszczescia[wynik_biedaka + 1] + szansa_ze_tu_juz_kaplica; if (ogon_nieszczescia[wynik_biedaka] >= MOD) ogon_nieszczescia[wynik_biedaka] -= MOD; } for (int wynik_biedaka = pierwsza_podejrzana_kolumna; wynik_biedaka < prog_konca_imprezy; wynik_biedaka++) { int ile_rzutow_konczy = wynik_biedaka - poczatek_strefy_bum + 1; long long lewy_kociolek = szybkie_czarowanie(ogon_nieszczescia[wynik_biedaka], liczba_glodomorow); long long prawy_kociolek = szybkie_czarowanie(ogon_nieszczescia[wynik_biedaka + 1], liczba_glodomorow); long long roznica_kotletow = lewy_kociolek - prawy_kociolek; if (roznica_kotletow < 0) roznica_kotletow += MOD; long long dokladka = roznica_kotletow * ile_scian_ma_kostka % MOD * odwrotne_parowki[ile_rzutow_konczy] % MOD; odpowiedz_wielkiego_szamana += dokladka; if (odpowiedz_wielkiego_szamana >= MOD) odpowiedz_wielkiego_szamana -= MOD; } cout << odpowiedz_wielkiego_szamana % MOD << '\n'; return 0; } |
English