我們稱乙個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件:
(1)它是從1到2n共2n個整數的乙個排列;
(2)所有的奇數項滿足a1
(3)任意相鄰的兩項a2i-1與a2i(1<=i<=n)滿足奇數項小於偶數項,即:a2i-1
現在的任務是:對於給定的n,請求出有多少個不同的長度為2n的有趣的數列。因為最後的答案可能很大,所以只要求輸出答案 mod p的值。
輸入格式:
輸入檔案只包含用空格隔開的兩個整數n和p。輸入資料保證,50%的資料滿足n<=1000,100%的資料滿足n<=1000000且p<=1000000000。
輸出格式:
僅含乙個整數,表示不同的長度為2n的有趣的數列個數mod p的值。
輸入樣例#1:
3 10
輸出樣例#1:
5對應的5個有趣的數列分別為(1,2,3,4,5,6),(1,2,3,5,4,6),(1,3,2,4,5,6),(1,3,2,5,4,6),(1,4,2,5,3,6)。
solution:
本題zyys。
1.觀察下列幾種簡單情況:
$(1)n=1:(1,2);$
$(2)n=2:(1,2,3,4),(1,3,2,4);$
$(3)n=3:(1,2,3,4,5,6),(1,2,3,5,4,6),(1,3,2,4,5,6),(1,3,2,5,4,6),(1,4,2,5,3,6);$
可以發現每組中$1$一定在第乙個位置,$2n$一定在最後乙個位置,由數列的性質可以證明;
每組數列都可:增加方案數為n-1;移動上一次$2n$的位置,增加方案數為$1$;在此基礎上新增$2n-1$,可以發現$2n-1$允許插入的範圍為$n+1,n+2,...,2n-1$,由乘法原理知,總方案數為$\frac$;
2.所以本題化簡為求解模$p$剩餘系下的卡特蘭數,那麼通過卡特蘭數通項公式化簡知$c[n]=2n\times (2n-1).....\times (n+2)/n!$,易證分子是可以整除分母的,那麼統計約分後各個因子個數即可;
3.用線性篩法求出$[1,2n]$的$mindiv$(最小質因數),將分母分子分解質因數;
4.計算各質因數的冪取模相乘即可;
**:
#include#define il inline#define ll long long
#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
using
namespace
std;
const
int n=2000005
;ll n,mod,ans,cnt,prime[n],isprime[n],minn[n],tot[n];
il ll fast(ll s,ll k)
return
ans;
}int
main()
}for(i,n+2,n<<1
) for(i,
1,n)
ll ans=1
; for(i,
1,cnt) ans=ans*fast(prime[i],tot[prime[i]])%mod;
cout
}
P3200 HNOI2009 有趣的數列
p3200 hnoi2009 有趣的數列 樣例輸入 3 10 樣例輸出 5 看樣例猜做法 大概猜一猜 觀察到答案是卡特蘭數列 接下來我們看看為什麼是這樣。首先化簡題目 對於乙個 2 n 的排列,我們要求 奇數字置上的數遞增 偶數字置上的數遞增 奇偶相鄰位置數遞增 奇怪的tip 偶奇相鄰不用遞增 首先...
HNOI2009 有趣的數列
求 1 到 2n 的全排列種類數,滿足奇數項和偶數項分別單增,任意 a a 以下為亂搞。考慮從1開始考慮每個數字怎麼填,可以看 猜 出,由於相鄰偶數項比奇數項大,所以奇數項一定要小一些,所以奇數項填的數字個數一定始終大於等於偶數項,這就是個卡特蘭數啦 問題變成求 catlan n p 由於 p 不是...
1485 HNOI2009 有趣的數列
題目鏈結 題目大意 稱乙個長度為2n 的數列是有趣的,當且僅當該數列滿足以下三個條件 它是乙個1 2n的排列a1 n 1,a2 n a2 i 1i 題解 丟題解跑qaq 我的收穫 2333 include using namespace std define maxn 3000005 int n,p...