#include #include #include #include #include #include #include #include #include #include #include #define reps(i,s,n) for(int (i) = (s); (i) < (n); (i)++) #define rep(i,n) reps(i,0,n) using namespace std; using ll = long long; using pii = pair; using vi = vector ; using vl = vector; //https://yukicoder.me/problems/918 //定数 #define INF 1000000000000 //10^12:極めて大きい値,∞ #define MOD 1000000007 //10^9+7:合同式の法 #define MAXR 600000 //10^5:配列の最大のrange(素数列挙などで使用) template class modint{ public: ll val=0; //コンストラクタ modint(ll x=0){while(x<0)x+=mod;val=x%mod;} //コピーコンストラクタ modint(const modint &r){val=r.val;} //算術演算子 modint operator -(){return modint(-val);} //単項 modint operator +(const modint &r){return modint(*this)+=r;} modint operator -(const modint &r){return modint(*this)-=r;} modint operator *(const modint &r){return modint(*this)*=r;} modint operator /(const modint &r){return modint(*this)/=r;} //代入演算子 modint &operator +=(const modint &r){ val+=r.val; if(val>=mod)val-=mod; return *this; } modint &operator -=(const modint &r){ if(valval==r.val;} bool operator <(const modint& r){return this->valval!=r.val;} }; using mint = modint; //入出力ストリーム istream &operator >>(istream &is,mint& x){//xにconst付けない ll t;is >> t; x=t; return (is); } ostream &operator <<(ostream &os,const mint& x){ return os<> n >> m; mint ans = 0; rep(i,m){ mint tmp = 1; tmp = COM(m,i); tmp = tmp * modpow(m-i,n); if(i % 2 == 0){ ans += tmp; }else{ ans -= tmp; } } cout << ans << endl; return 0; }