/*Flow..................*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FOR(i,a,n) for(i=a;i=n;i--) #define FORS(i,a) for(i=0;a[i];i++) #define si(x) scanf("%d",&x) #define sd(x) scanf("%lf",&x) #define sll(x) scanf("%lld",&x) #define ss(x) scanf("%s",x) #define prs(x) printf("%d ",x) #define pls(x) printf("%lld ",(long long)x) #define pi(x) printf("%d\n",x) #define pd(x) printf("%0.10lf\n",x); #define pll(x) printf("%lld\n",(long long)x) #define ps(x) printf("%s\n",x) #define M 1000000007 #define ll long long #define all(x) x.begin(),x.end() #define pb push_back #define fr first #define se second #define in insert #define er erase #define pii pair #define plll pair #define PI 3.14159265358979323846264338327950288419716939937510582097494459230 #define fre freopen("input.txt","r",stdin),freopen("output.txt","w",stdout) using namespace std; ll gcd (ll a, ll b) {return ( a ? gcd(b%a, a) : b );} ll power(ll a, ll n) {ll p = 1;while (n > 0) {if(n&1) {p = p * a;} n >>= 1; a *= a;} return p;} ll power(ll a, ll n, ll mod) {ll p = 1;while (n > 0) {if(n&1) {p = p * a; p %= mod;} n >>= 1; a *= a; a %= mod;} return p % mod;} #define bs(x,y,z,w) {cerr< ostream& operator<<(ostream& os, const set &p){os << "{ "; for (T x: p) os << x << " "; os << "}" << endl; return os;} template ostream& operator<<(ostream& os, const multiset &p){os << "{ "; for (T x: p) os << x << " "; os << "}" << endl; return os;} template ostream& operator<<(ostream& os, const map &p){os << "{ "; for (pair x: p) os << x << " "; os << "}" << endl; return os;} template ostream& operator<<(ostream& os, const pair &p){os << "{" << p.first << ',' << p.second << "}";return os;} ll a[100005]; int main() { int i,j; ll n,k,x; sll(n),sll(k),sll(x); a[3]=k-1; FOR(i,4,100005) a[i]=(power(k-1,i-2,M)-a[i-1]+M)%M; if(n%2) pll(a[n]-(x>1)); else pll(a[n]+(x>1)); return 0; }