#include #include #include #include #include #include #include #define N_MAX 2000002 using namespace std; typedef long long ll; const ll MOD = 1000000007; class ModInt{ public: ll v; ModInt(ll _v = 0){ v = _v; } ModInt operator+(ll n){ return ModInt((v+n)%MOD); } ModInt operator-(ll n){ return ModInt((v-n+MOD)%MOD); } ModInt operator*(ll n){ return ModInt((v*n)%MOD); } ModInt operator/(ll n){ return ModInt((ModInt(n).inv()*v).v%MOD); } void operator+=(ll n){ v = (v+n)%MOD; } void operator-=(ll n){ v = (v-n+MOD)%MOD; } void operator*=(ll n){ v = (v*n)%MOD; } ModInt operator+(ModInt n){ return ModInt((v+n.v)%MOD); } ModInt operator-(ModInt n){ return ModInt((v-n.v+MOD)%MOD); } ModInt operator*(ModInt n){ return ModInt((v*n.v)%MOD); } ModInt operator/(ModInt n){ return ModInt((n.inv()*v).v%MOD); } void operator+=(ModInt n){ v = (v+n.v)%MOD; } void operator-=(ModInt n){ v = (v-n.v+MOD)%MOD; } void operator*=(ModInt n){ v = (v*n.v)%MOD; } void operator=(ModInt n){ v = n.v; } void operator=(ll n){ v = n; } ModInt inv(){ if(v == 1) return ModInt(1); else return ModInt(MOD-ModInt(MOD%v).inv().v*(MOD/v)%MOD); } }; ostream& operator<<(ostream& os, const ModInt& m){ os << m.v; return os; } istream & operator >> (istream &in, ModInt &m){ in >> m.v; return in; } ModInt pow(ModInt a, ll n) { ModInt ans = 1; ModInt tmp = a; for (int i = 0; i <= 60; i++) { ll m = (ll)1 << i; if (m & n) { ans *= tmp; } tmp *= tmp; } return ans; } ModInt inv[N_MAX],fac[N_MAX],finv[N_MAX]; void init(){ fac[0]=1;fac[1]=1; finv[0]=1;finv[1]=1; inv[1]=1; for(int i=2;i> n >> k >> m; if(m == 1 && k == 1){ cout << pow(ModInt(n), n-1) << endl; return 0; } ModInt ans = 0; // 1がloopに含まれる for(int l = 2; l <= n; l++){ if(l >= k+1 && m != 1) continue; if(k%l == 0) { if(m == 1) ans += comb(n-1, l-1)*fac[l-1]*pow(ModInt(n), n-l); }else{ if(m != 1) ans += comb(n-2, l-2)*fac[l-2]*pow(ModInt(n), n-l); } } if(m == 1){ ans += pow(ModInt(n), n-1); cout << ans << endl; return 0; } // 1がloopに含まれないかつ一周以上している for(int x = 2; x <= n; x++){ // ModInt tmp = if(k >= x) ans += comb(n-2, x-2)*fac[x-2]*pow(ModInt(n), n-x)*(x-1); else continue; } // 一周未満 if(k+1 <= n) ans += comb(n-2, k-1)*fac[k-1]*pow(ModInt(n), n-k); cout << ans << endl; }