/*{{{*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SZ(X) ((int)(X).size()) #define ALL(X) (X).begin(), (X).end() #define REP(I, N) for (int I = 0; I < (N); ++I) #define REPP(I, A, B) for (int I = (A); I < (B); ++I) #define FOR(I, A, B) for (int I = (A); I <= (B); ++I) #define FORS(I, S) for (int I = 0; S[I]; ++I) #define RS(X) scanf("%s", (X)) #define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end())))) #define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin()) #define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++) #define MP make_pair #define PB push_back #define MS0(X) memset((X), 0, sizeof((X))) #define MS1(X) memset((X), -1, sizeof((X))) #define LEN(X) strlen(X) #define F first #define S second using namespace std; typedef int64_t LL; typedef uint64_t ULL; typedef long double LD; typedef pair PII; typedef vector VI; typedef vector VL; typedef vector VPII; typedef pair PLL; typedef vector VPLL; template void _R(T &x) { cin >> x; } void _R(int &x) { scanf("%d", &x); } void _R(int64_t &x) { scanf("%lld", &x); } void _R(double &x) { scanf("%lf", &x); } void _R(char &x) { scanf(" %c", &x); } void _R(char *x) { scanf("%s", x); } void R() {} template void R(T &head, U &... tail) { _R(head); R(tail...); } template void _W(const T &x) { cout << x; } void _W(const int &x) { printf("%d", x); } void _W(const int64_t &x) { printf("%lld", x); } void _W(const double &x) { printf("%.16f", x); } void _W(const char &x) { putchar(x); } void _W(const char *x) { printf("%s", x); } template void _W(const pair &x) {_W(x.F); putchar(' '); _W(x.S);} template void _W(const vector &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); } void W() {} template void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); } template void DEBUG(const T &head, const U &... tail) { #ifdef HOME _W('#'); _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); #endif } int MOD = 1e9+7; void ADD(LL& x,LL v){x=(x+v)%MOD;if(x<0)x+=MOD;} /*}}}*/ const int SIZE = 1e6+10; LL fac[SIZE],inv[SIZE]; LL mypow(LL x,LL y){ LL res=1; while(y){ if(y&1)res=res*x%MOD; y>>=1; x=x*x%MOD; } return res; } LL C(int x,int y){ if(y<0||y>x)return 0; return fac[x]*inv[y]%MOD*inv[x-y]%MOD; } void build(){ assert(MOD>=SIZE); fac[0]=1; REPP(i,1,SIZE)fac[i]=fac[i-1]*i%MOD; inv[SIZE-1]=mypow(fac[SIZE-1],MOD-2); for(int i=SIZE-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%MOD; } LL dp[SIZE][3]; int main(){ int n,k,x; R(n,k,x); n--; dp[0][0]=1; REP(i,n){ ADD(dp[i+1][0],dp[i][1]+dp[i][2]); ADD(dp[i+1][1],dp[i][0]+dp[i][2]); ADD(dp[i+1][2],(dp[i][0]+dp[i][1])*(k-2)); ADD(dp[i+1][2],(dp[i][2])*(k-3)); } if(x==1)W(dp[n][0]); else W(dp[n][1]); return 0; }