#include using namespace std; const int MOD = 666013; int lgpow(int a, int b) { int res = 1; for(int i = 0; (1 << i) <= b; ++i) { if((1 << i) & b) res = 1LL * res * a % MOD; a = 1LL * a * a % MOD; } return res; } int main() { int n, m; cin >> n >> m; if(n < m) { cout << "0\n"; return 0; } vector der(m + 1, 0); der[0] = 1; for(int i = 2; i <= m; ++i) { der[i] = 1LL * (i - 1) * (der[i - 1] + der[i - 2]) % MOD; } int ans = der[m]; vector fact(n + 1, 1); vector inv(n + 1, 1); vector invFact(n + 1, 1); for(int i = 1; i <= n; ++i) { fact[i] = 1LL * fact[i - 1] * i % MOD; } for(int i = 2; i <= n; ++i) { inv[i] = (MOD - 1LL * (MOD / i) * inv[MOD % i] % MOD); assert(1LL * inv[i] * i % MOD == 1); invFact[i] = 1LL * invFact[i - 1] * inv[i] % MOD; } auto Comb = [&] (int a, int b) { if(a < b) return 0; int ans = fact[a]; ans = 1LL * ans * invFact[b] % MOD; ans = 1LL * ans * invFact[a - b] % MOD; return ans; }; vector pp(m + 1, 1); for(int i = 1; i <= m; ++i) pp[i] = lgpow(i, n); int part = 0; for(int i = 0; i < m; ++i) { int temp = 1LL * Comb(m, i) * pp[m - i] % MOD; if(i % 2 == 0) part += temp; else part -= temp; while(part < 0) part += MOD; part %= MOD; } ans = 1LL * ans * part % MOD; cout << ans << "\n"; }