/// In The Name Of God #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,sse3,sse4,popcnt,abm,mmx") #include #define f first #define s second #define pb push_back #define pp pop_back #define mp make_pair #define sz(x) (int)x.size() #define sqr(x) ((x) * 1ll * (x)) #define all(x) x.begin(), x.end() #define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0); #define nl '\n' #define ioi exit(0); typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int N = (int)1e5 + 7, inf = (int)1e9 + 7, mod = (int)1e9 + 7; const ll linf = (ll)1e18 + 7; const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1}, dy[] = {0, 1, 0, -1, 1, -1, 1, -1}; using namespace std; int n, k, x; int dp[6][N], pref[6][N]; int calc(int v = 2, int last = 1) { if (v == n) { return x != last; } if (~dp[v][last]) return dp[v][last]; int res = 0; for (int i = 1; i <= k; i++) { if (i != last) { res += calc(v + 1, i); if (res >= mod) res -= mod; } } return dp[v][last] = res; } int slow() { memset(dp, 0, sizeof(dp)); dp[1][1] = 1; for (int i = 1; i <= k; i++) { pref[1][i] = pref[1][i - 1] + dp[1][i]; } for (int i = 2; i <= n; i++) { for (int j = 1; j <= k; j++) { dp[i][j] = pref[i - 1][k] - pref[i - 1][j]; if (dp[i][j] >= mod) dp[i][j] -= mod; dp[i][j] += pref[i - 1][j - 1]; if (dp[i][j] >= mod) dp[i][j] -= mod; } for (int j = 1; j <= k; j++) { pref[i][j] = pref[i][j - 1] + dp[i][j]; if (pref[i][j] >= mod) pref[i][j] -= mod; } } int res = 0; for (int i = 1; i <= k; i++) { if (i != x) { res += dp[n - 1][i]; if (res >= mod) res -= mod; } } return res; } int main() { #ifdef IOI2018 freopen ("in.txt", "r", stdin); //freopen ("slow.out", "w", stdout); #endif Kazakhstan cin >> n >> k >> x; int sv = n, sx = x; n = min(n, 5); x = 1; ll res = slow(); for (int i = 5; i < sv; i++) { res *= k - 1; if (i & 1) res -= k - 1; else res += k - 1; res %= mod; } if (sx > 1 && sv % 2) res--; else if (sx > 1 && sv % 2 == 0) res++; cerr << res % mod << nl; cout << res % mod; ioi }