// WIKIPEDIA FTW #include using namespace std; const int kMod = 666013; namespace ModOps { int add(int a, int b) { a += b; if(a >= kMod) a -= kMod; return a; } int sub(int a, int b) { a -= b; if(a < 0) a += kMod; return a; } int mul(int a, int b) { return 1LL * a * b % kMod; } int lgpow(int b, int e) { int r = 1; while(e) { if(e % 2) r = mul(r, b); b = mul(b, b); e /= 2; } return r; } int inv(int x) { return lgpow(x, kMod - 2); } }; using namespace ModOps; int Fact[500000], IFact[500000]; void Preproc() { Fact[0] = IFact[0] = 1; for(int i = 1; i <= 200000; ++i) { Fact[i] = mul(Fact[i - 1], i); IFact[i] = inv(Fact[i]); } } int GetDerang(int n) { int ans = 0; int pw = 1; for(int i = 0; i <= n; ++i) { ans = add(ans, mul(pw, IFact[i])); pw = mul(pw, kMod - 1); } return mul(ans, Fact[n]); } int GetComb(int n, int k) { return mul(Fact[n], mul(IFact[k], IFact[n - k])); } int GetStirling(int n, int k) { int ans = 0; int coef = 1; for(int j = 1; j <= k; ++j) coef = mul(coef, kMod - 1); for(int j = 0; j <= k; ++j) { ans = add(ans, mul(mul(coef, GetComb(k, j)), lgpow(j, n))); coef = mul(coef, kMod - 1); } return mul(ans, IFact[k]); } int main() { int n, m; cin >> n >> m; Preproc(); for(int i = 0; i < 5; ++i) { for(int j = 0; j <= i; ++j) cerr << GetComb(i, j) << " "; cerr << endl; } for(int i = 1; i <= 10; ++i) { cerr << GetDerang(i) << " "; } cerr << endl; cout << mul(Fact[m], mul(GetDerang(m), GetStirling(n, m))) << endl; return 0; }