#include <bits/stdc++.h>
using namespace std;
#define PB push_back
#define LL long long
#define int LL
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORD(i,a,b) for (int i = (a); i >= (b); i--)
#define REP(i,n) FOR(i,0,(int)(n)-1)
#define st first
#define nd second
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define VI vector<int>
#define PII pair<int,int>
#define LD long double
template<class C> void mini(C& a4, C b4) { a4 = min(a4, b4); }
template<class C> void maxi(C& a4, C b4) { a4 = max(a4, b4); }
template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";}
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
while(*sdbg!=',')cerr<<*sdbg++;
cerr<<"="<<h<<","; _dbg(sdbg+1, a...);
}
template<class T> ostream &operator<<(ostream &os, vector<T> V){
os<<"[";for(auto vv:V)os<<vv<<",";return os<<"]";
}
template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) {
return os << "(" << P.st << "," << P.nd << ")";
}
#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif
const int mod = 1e9 + 7;
void add_m(int &a, int b) {
a += b;
if (a >= mod) a -= mod;
}
void sub_m(int &a, int b) {
a -= b;
if (a < 0) a += mod;
}
int mul_m(int a, int b) {
return a % mod * (b % mod) % mod;
}
int pw(int b, int e) {
int r = 1; b %= mod;
for (; e > 0; e >>= 1) {
if (e & 1) r = mul_m(r, b);
b = mul_m(b, b);
}
return r;
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k, m;
cin >> n >> k >> m;
int inv_k = pw(k, mod - 2);
VI visit(m), visit_psum(m);
visit[0] = 1;
visit_psum[0] = 1;
FOR(s, 1, m - 1) {
int lo = max(0LL, s - k);
int window = visit_psum[s - 1];
if (lo > 0) {
sub_m(window, visit_psum[lo - 1]);
}
visit[s] = mul_m(inv_k, window);
visit_psum[s] = visit_psum[s - 1];
add_m(visit_psum[s], visit[s]);
}
int ans = 0;
int safe = max(0LL, m - k);
if (safe > 0)
ans = mul_m(n, visit_psum[safe - 1]);
int cum_exit = 0;
int surv_prev = 1;
FOR(s, safe, m - 1) {
int exit_num = s + k - m + 1;
int exit_prob = mul_m(exit_num, inv_k);
add_m(cum_exit, mul_m(visit[s], exit_prob));
int one_minus_cum = 1;
sub_m(one_minus_cum, cum_exit);
int surv_cur = pw(one_minus_cum, n);
int delta = surv_prev;
sub_m(delta, surv_cur);
int contrib = mul_m(mul_m(delta, k), pw(exit_num, mod - 2));
add_m(ans, contrib);
surv_prev = surv_cur;
}
cout << ans << endl;
}
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <bits/stdc++.h> using namespace std; #define PB push_back #define LL long long #define int LL #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define FORD(i,a,b) for (int i = (a); i >= (b); i--) #define REP(i,n) FOR(i,0,(int)(n)-1) #define st first #define nd second #define ALL(x) (x).begin(), (x).end() #define SZ(x) ((int)(x).size()) #define VI vector<int> #define PII pair<int,int> #define LD long double template<class C> void mini(C& a4, C b4) { a4 = min(a4, b4); } template<class C> void maxi(C& a4, C b4) { a4 = max(a4, b4); } template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";} template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) { while(*sdbg!=',')cerr<<*sdbg++; cerr<<"="<<h<<","; _dbg(sdbg+1, a...); } template<class T> ostream &operator<<(ostream &os, vector<T> V){ os<<"[";for(auto vv:V)os<<vv<<",";return os<<"]"; } template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) { return os << "(" << P.st << "," << P.nd << ")"; } #ifdef LOCAL #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #else #define debug(...) (__VA_ARGS__) #define cerr if(0)cout #endif const int mod = 1e9 + 7; void add_m(int &a, int b) { a += b; if (a >= mod) a -= mod; } void sub_m(int &a, int b) { a -= b; if (a < 0) a += mod; } int mul_m(int a, int b) { return a % mod * (b % mod) % mod; } int pw(int b, int e) { int r = 1; b %= mod; for (; e > 0; e >>= 1) { if (e & 1) r = mul_m(r, b); b = mul_m(b, b); } return r; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, k, m; cin >> n >> k >> m; int inv_k = pw(k, mod - 2); VI visit(m), visit_psum(m); visit[0] = 1; visit_psum[0] = 1; FOR(s, 1, m - 1) { int lo = max(0LL, s - k); int window = visit_psum[s - 1]; if (lo > 0) { sub_m(window, visit_psum[lo - 1]); } visit[s] = mul_m(inv_k, window); visit_psum[s] = visit_psum[s - 1]; add_m(visit_psum[s], visit[s]); } int ans = 0; int safe = max(0LL, m - k); if (safe > 0) ans = mul_m(n, visit_psum[safe - 1]); int cum_exit = 0; int surv_prev = 1; FOR(s, safe, m - 1) { int exit_num = s + k - m + 1; int exit_prob = mul_m(exit_num, inv_k); add_m(cum_exit, mul_m(visit[s], exit_prob)); int one_minus_cum = 1; sub_m(one_minus_cum, cum_exit); int surv_cur = pw(one_minus_cum, n); int delta = surv_prev; sub_m(delta, surv_cur); int contrib = mul_m(mul_m(delta, k), pw(exit_num, mod - 2)); add_m(ans, contrib); surv_prev = surv_cur; } cout << ans << endl; } |
English