題目描述
稱乙個1,2,...,n的排列p1,p2...,pn是magic的,當且僅當2<=i<=n時,pi>pi/2. 計算1,2,...n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值
輸入格式
輸入檔案的第一行包含兩個整數 n和p,含義如上所述。
輸出格式
輸出檔案中僅包含乙個整數,表示計算1,2,?, ???的排列中, magic排列的個數模 p的值。
樣例樣例輸入
20 23
樣例輸出
16
資料範圍與提示
100%的資料中,1 ≤ ??? n ≤ 106, p??? ≤ 10^9,p是乙個質數。 資料有所加強
剛剛學了組合數學,然後就水了道題。
模板一定要好好學,乙個取模頹老半天。。。。。
然後開始說正經的
首先這題仔細想想可以看成二叉堆(滿足大小關係嘛。。。)
然後就可以像個樹規似的
從最下的節點看是向上轉移
設f陣列表示方案數size陣列表示子樹大小
因為每個節點的左子樹的方案樹與右子樹方案數相乘並沒有列舉出全部結果
仔細想想每個節點的左右子樹的數是可以互換的這樣依舊滿足二叉堆性質
即 c(size[i]-1,size[left])可表示
然後資料範圍可以用盧卡斯定理取模
這就不解釋了反正網上很多。。。。
c(n,m)%p=c(n%p,m%p)*c(n/p,m/p)%p
總之最後轉移的式子
f[x]=f[x*2]*f[x*2+1]*c(size[x]-1,size[x*2])
蒟蒻第一次寫部落格如有不當請指正
1 #include2 #include3 #include4 #include5 #include6view code#define maxn 2006001
7#define ll long long
8using
namespace
std;
9ll sum[maxn];
10ll size[maxn],f[maxn];
11ll n,p;
12ll pow(ll x,ll y)
1321
return ans%p;22}
23ll getsum(ll x,ll y)
2429
ll lucas(ll x,ll y)
3036
void
find(ll k)
3739 find(k*2);find(k*2+1
);40 size[k]=size[k*2]+size[k*2+1]+1
;41 f[k]=f[k*2]*f[k*2+1]%p*lucas(size[k]-1,size[k*2])%p;42}
43int
main()
44
Perm排列計數
記憶體限制 512 mib 時間限制 1000 ms 標準輸入輸出 題目描述 稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入格式 輸入檔案的第一行包含兩個整數 n和p,含...
Perm 排列計數
題目描述 稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入格式 輸入檔案的第一行包含兩個整數 n和p,含義如上所述。輸出格式 輸出檔案中僅包含乙個整數,表示計算1,2的排列...
Perm排列計數(bzoj2111)
time limit 10 sec memory limit 259 mb submit 2686 solved 811 submit status discuss 稱乙個1,2,n的排列p1,p2 pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的...