// https://ferin-tech.hatenablog.com/entry/2018/01/17/010829 #define __USE_MINGW_ANSI_STDIO 0 #include using namespace std; typedef long long ll; #define int ll typedef vector VI; typedef vector VVI; typedef pair PII; #define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i) #define REP(i, n) FOR(i, 0, n) #define ALL(x) x.begin(), x.end() #define IN(a, b, x) (a<=x&&x T &chmin(T &a, const T &b) { return a = min(a, b); } template T &chmax(T &a, const T &b) { return a = max(a, b); } template ostream &operator <<(ostream& out,const pair& a){ out<<'('< 0) { if(e%2 == 0) {p = (p*p) % mod; e /= 2;} else {a = (a*p) % mod; e--;} } return a % mod; } // x = a1 mod m1, x2 = a2 mod m2 を解く オーバーフローには注意 // O(log(min(m1, m2))) pair crt(ll a1, ll a2, ll m1, ll m2) { auto normal = [](ll x, ll m) { return x>=-x ? x%m : m-(-x)%m; }; auto modmul = [&normal](ll a, ll b, ll m) { return normal(a, m)*normal(b, m)%m; }; ll k1, k2; ll g = extgcd(m1, m2, k1, k2); if(normal(a1, g) != normal(a2, g)) return {-1, -1}; ll l = m1 / g * m2; ll x = a1 + modmul(modmul((a2-a1)/g, k1, l), m1, l); return {x, l}; } pair crt(vector a, vector m) { ll mod = 1, ans = 0; int n = a.size(); REP(i, n) { tie(ans, mod) = crt(ans, a[i], mod, m[i]); if(ans == -1) return {-1, -1}; } return {ans, mod}; } ll fact[1000010], ifact[1000010]; void makeFac(ll p, ll q) { ll pr = 1; REP(i, q) pr *= p; fact[0] = ifact[0] = 1; FOR(i, 1, pr+1) { if(i%p == 0) { fact[i] = fact[i-1]; } else { fact[i] = fact[i-1] * i % pr; } ifact[i] = inv(fact[i], pr); } } ll C(ll n, ll r, ll p, ll q) { if(n < 0 || r < 0 || r > n) return 0; // pr = p^q int pr = 1; REP(i, q) pr *= p; ll z = n-r; int e0 = 0; for(ll u=n/p;u;u/=p) e0 += u; for(ll u=r/p;u;u/=p) e0 -= u; for(ll u=z/p;u;u/=p) e0 -= u; int em = 0; for(ll u=n/pr;u;u/=p) em += u; for(ll u=r/pr;u;u/=p) em -= u; for(ll u=z/pr;u;u/=p) em -= u; ll ret = 1; while(n > 0) { ret = ret*fact[n%pr]%pr*ifact[r%pr]%pr*ifact[z%pr]%pr; n /= p; r /= p; z /= p; } (ret *= binpow(p, e0, pr)) %= pr; if(!(p==2 && q >= 3) && em%2) ret = (pr-ret) % pr; return ret; } ll func(ll n, ll r, ll mod) { ll x = mod; vector a, m; FOR(i, 2, mod+1) if(x%i == 0) { ll cnt=0, pr=1; while(x%i==0) x/=i, cnt++, pr*=i; makeFac(i, cnt); a.PB(C(n, r, i, cnt)); m.PB(pr); } return crt(a, m).first; } signed main(void) { ll n, m; cin >> n >> m; const string ans = to_string(func(n, m, 100000000)); cout << string(8 - ans.length(), '0') << ans << '\n'; return 0; }