鍘熼鍦板潃
榪欐槸涓秴綰уぇ姘撮錛屾垜澶矙鑼朵簡(jiǎn)錛屾兂鍌諱簡(jiǎn)N涔?#8230;…鍚庢潵鎵嶅弽搴旇繃鏉?#8230;…鎵浠ヨ鍐欎竴涓嬩綔涓鴻紺恒?br />
棣栧厛榪欎釜搴忓垪灝辨槸涓涓爢……
鍥犳錛岄棶棰樹(shù)篃灝辨槸璇碞涓粨鐐癸紝鏉冨煎垰濂藉彇閬?~N鐨勫爢鐨勬繪暟……
璁劇粨鏋滀負(fù)F[N]銆傝N涓粨鐐圭殑鍫嗭紝宸﹀瓙鏍?wèi)鏈塴涓粨鐐癸紝鍙沖瓙鏍?wèi)鏈塺涓粨鐐癸紙鏄劇劧鏈塴+r+1=N錛夛紝鍒欐湁
F[N]=C(N-1, l) * F[l] * F[r]
榪欎釜鐞嗚В璧鋒潵寰堝鏄撳洤……鍥犱負(fù)鏍圭粨鐐瑰彧鑳芥槸1錛屽乏瀛愭爲(wèi)鍜屽彸瀛愭爲(wèi)鏄劇劧涔熼兘鏄爢錛屽洜姝ょ浉褰撲簬鍦?~N涓彇l涓暟緇勬垚宸﹀瓙鏍?wèi)锛屽墿涓嬬殑鏁熬l勬垚鍙沖瓙鏍?#8230;…鍙堝洜涓轟笉綆″彇鍝簺鏁幫紝宸﹀彸瀛愭爲(wèi)鐨勭粍鎴愭柟娉曟繪暟閮芥槸F[l]銆丗[r]錛堝彧涓庢搴忔湁鍏籌級(jí)……榪欐牱灝卞緱鍒頒笂闈㈢殑寮忓瓙浜?jiǎn)鍥?#8230;…
C(N-1, l)=N! / l! / r!錛屽洜姝ら渶瑕侀澶勭悊鍑烘潵A[i] = i! mod P錛岀劧鍚庨櫎娉曠敤閫嗗厓?yōu)p浜?jiǎn)鍥?#8230;…
涓嶈繃錛屾湰娌欒尪涓寮濮嬫兂鎸夌収灞傛暟鏋氫婦錛岀劧鍚庣浉涔?#8230;…鑷劧鎼炰笉鍑烘潵鍥?#8230;…鍚庢潵鍙堢敤鏆村姏鎶奛<=15鐨勭粨鏋滄嬁鍑烘潵鍒嗘瀽錛屾兂鎵懼埌瑙勫緥……緇撴灉姣棤瑙勫緥……鍚庢潵鍙堢籂緇撲簡(jiǎn)N涔呮墠鎯沖埌涓婇潰榪欎釜……鐪熸姣旇禌鐨勬椂鍊欏氨鎮(zhèn)插墽浜?jiǎn)鍥?#8230;…鎵浠ヨ璀︾ず涓涓?#8230;…
浠g爜錛?br />#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 1000010, INF = ~0U >> 2;
int n;
ll MOD, A[MAXN], F[MAXN], res;
void init()
{
cin >> n >> MOD;
}
void prepare()
{
A[0] = A[1] = 1; re3(i, 2, n) A[i] = (A[i - 1] * i) % MOD;
}
void exgcd(ll a, ll b, ll &x, ll &y)
{
if (b) {
ll _x, _y; exgcd(b, a % b, _x, _y);
x = _y; y = _x - (a / b) * _y;
} else {x = 1; y = 0;}
}
void solve()
{
F[0] = F[1] = 1; int s = 1, l = 0, r = 0; ll x, y;
re3(i, 2, n) {
if (l == s) {
if (r == s) {s += s + 1; l++;} else r++;
} else l++;
F[i] = F[l] * F[r] % MOD; F[i] = F[i] * A[i - 1] % MOD;
exgcd(A[l], MOD, x, y); F[i] = F[i] * x % MOD; if (F[i] < 0) F[i] += MOD;
exgcd(A[r], MOD, x, y); F[i] = F[i] * x % MOD; if (F[i] < 0) F[i] += MOD;
}
res = F[n];
}
void pri()
{
cout << res << endl;
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}

]]>