記憶體限制:512 mib 時間限制:1000 ms 標準輸入輸出
題目描述
稱乙個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是乙個質數。 資料有所加強
題解
剛拿到這道題的時候沒什麼思路,但腦子啊有時候吧~~
可以把這個題想象成一棵二叉樹,下標即在排列中的位置,當然1為根
乙個點的任意乙個子孫一直除2的話最終都會到該點,即在以該點為根的子樹內,該點值最小
假設有n個點,父親要最小的那乙個,左右兒子各自成家,互不干擾,左兒子要剩下的n-1個中的m個,剩下的都給了右兒子一家,組合數為c(n-1,m),向下乙個個分下去你會發現
轉移式為 f[爹]=f[左兒子]*f[右兒子]*c(size,size) f表示滿足條件的組合數,size表示以該點為根的樹的大小
因為n有點大,n!會炸掉,所以求組合數的時候上lucas定理就歐了
弱弱的lockey死活不用lucas(我牛逼,我偉大),一直在搞高精乘低精,高精除低精,但還是在強悍的lucas面前獻上了膝蓋%%%%
#include#includeusing
namespace
std;
int n,p,son[110000000],d[100000000
];long
long ans=1
;long
long pow(long
long a,long
long b,long
long
p) ans%=p;
return
ans;
}long
long inv(long
long x,long
long
p)long
long c(long
long n,long
long
m)long
long lucas(long
long n,long
long m,long
long
p)void dfs(int
x)
return;}
intmain()
dfs(1);
cout
}
Perm 排列計數
題目描述 稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入格式 輸入檔案的第一行包含兩個整數 n和p,含義如上所述。輸出格式 輸出檔案中僅包含乙個整數,表示計算1,2的排列...
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的...