#pragma GCC optimize ("O3") #pragma GCC target ("sse4") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //UWAGA - w czasie kompilacji musi byc znany rozmiar wektora - nie mozna go zmienic #include #include //do setprecision #include #include using namespace std; #define FOR(i,b,e) for(int i=(b);i<(e);++i) #define FORQ(i,b,e) for(int i=(b);i<=(e);++i) #define FORD(i,b,e) for(int i=(b)-1;i>=(e);--i) #define REP(x, n) for(int x = 0; x < (n); ++x) #define ALL(u) (u).begin(),(u).end() #define ST first #define ND second #define PB push_back #define MP make_pair #define LL long long #define ULL unsigned LL #define LD long double typedef pair PII; const double pi = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342; const int MOD = 1e9 + 7; const int MR = 1e5 + 10; int dp[MR][2]; int main() { int n, k, x; scanf("%d%d%d", &n, &k, &x); // first dp[1][0] = (x == 1 ? k - 1 : k - 2); // !x dp[1][1] = (x == 1 || n == 3 ? 0 : 1); // x // middle FOR(i, 2, n - 2) { dp[i][0] = (dp[i - 1][0] * (LL)(k - 2) + dp[i - 1][1] * (LL)(k - 1)) % MOD; dp[i][1] = dp[i - 1][0]; } // last dp[n - 2][0] = (dp[n - 3][0] * (LL)(k - 2) + dp[n - 3][1] * (LL)(k - 1)) % MOD; printf("%d\n", dp[n - 2][0]); return 0; }