bzoj1485: [HNOI2009]有趣的數列 卡特蘭數
50%的dp應該很好想。一看題解是卡特蘭數,我就震驚了。
我們來思考為什麼是卡特蘭數。。。
每個數只能走一次,設奇數位的為x 偶數位的為y 那麼到達(N,N)一直不能穿過直線y=x
由於路徑只能往右和往上走,所以這就是個卡特蘭數。
如果還不清楚,那麼可以理解為如果向上到(a,b)就是把下一個奇數位放a+b,如果向右到(a,b)就是把下一個偶數數位放a+b
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; #define maxn 2000010 bool vis[maxn]; int pri[maxn],cnt,a[maxn]; int n,p; void init() { for(int i=2;i<=2*n;i++) { if(!vis[i]) { cnt++;pri[cnt]=i; a[i]=cnt; } for(int j=1;j<=cnt&&i*pri[j]<=2*n;j++) { vis[i*pri[j]]=1;a[i*pri[j]]=j; if(i%pri[j]==0) { break; } } } } int num[maxn]; void add(int now,int f) { while(now!=1) { num[a[now]]+=f; now/=pri[a[now]]; } } int main() { scanf("%d%d",&n,&p); init(); long long ans=1; for(int i=n+1;i<=n*2;i++) add(i,1); for(int i=1;i<=n;i++)add(i,-1); add(n+1,-1); for(int i=1;i<=cnt;i++) while(num[i]--)ans=(ans*pri[i])%p; printf("%lld\n",ans); return 0; }
相關推薦
bzoj1485: [HNOI2009]有趣的數列 卡特蘭數
50%的dp應該很好想。一看題解是卡特蘭數,我就震驚了。 我們來思考為什麼是卡特蘭數。。。 每個數只能走一次,設奇數位的為x 偶數位的為y 那麼到達(N,N)一直不能穿過直線y=x 由於路徑只能往右和往上走,所以這就是個卡特蘭數。 如果還不清楚,那麼可以理解為如果向上到(a
BZOJ 1485: [HNOI2009]有趣的數列(卡特蘭數)
傳送門 解題思路 因為總共是一個排列,那麼確定了奇數項是哪些,偶數項就確定了。怎麼判斷奇數項是否合法呢,其實由於第三個限制,可以把這個數列看成一個括號序列,奇數項為\((\),偶數項為\()\),那麼合法方案數自然是卡特蘭數了。。模數不是質數,而且\(n^2\)會超時,就只能用\(ans=\frac{
bzoj 1485: [HNOI2009]有趣的數列 卡特蘭數
題意 我們稱一個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件: (1)它是從1到2n共2n個整數的一個排列ai; (2)所有的奇數項滿足a1<a3<…<a2n−1,
[bzoj1485][HNOI2009]有趣的數列_卡特蘭數_組合數
有趣的數列 bzoj-1485 HNOI-2009 題目大意:求所有1~2n的排列滿足奇數項遞增,偶數項遞增。相鄰奇數項大於偶數項的序列個數%P。 註釋:$1\le n\le 10^6$,$1\le P \le 10^9$。 想法:好題啊。 我們依次考慮1~2n,就是把當前$i$放進奇數項還是偶數
「BZOJ1485」[HNOI2009] 有趣的數列 卡特蘭數列
alt class ++ use 要求 現在 前三 inpu space 「BZOJ1485」[HNOI2009] 有趣的數列 Description 我們稱一個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件: (1)它是從1到2n共2n個整數的一
bzoj 1485: [HNOI2009]有趣的數列 (卡特蘭數)
1485: [HNOI2009]有趣的數列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1226 Solved: 652 [Submit][St
【算法專題】卡特蘭數(計數數列)
n-1 映射 點分治 blog -s 方法 .org div n-k Catalan數列:1 1 1 2 5 14 42 132 429 1430 4862 16796 【計數映射思想】 參考:卡特蘭數 — 計數的映射方法的偉大勝利 計數映射:將難以統計的數映射為另一種形式
ACM常用數列(斐波那契數列、卡特蘭數、貝爾數、斯特靈數)
斐波那契數列:任意一個數是其前兩位數只和,即f(i)=f(i-1)+f(i-2),f(1)=f(2)=1 該數列也滿足黃金分割比例,所以又成為黃金分割數列 相關題目連結:Fibbonacci Number #include<stdio.h> int m
(轉載)Catalan數——卡特蘭數
出現 註意 城市 ads 大於 編號 只有一個 導致 一個點 Catalan數——卡特蘭數 今天阿裏淘寶筆試中碰到兩道組合數學題,感覺非常親切,但是筆試中失蹤推導不出來後來查了下,原來是Catalan數。悲劇啊,現在整理一下一、Catalan數的定義令h(1)=1,Cata
卡特蘭數
ini bits clas cnblogs 操作 div esp class 序列 卡特蘭數是組合數學 常見的數列 主要有4中形式: 1: h(n)= C 2n n /(n+1) 2: h(n)= C 2n n - C 2n n-1 3: h(n)= h(n
HDU 1133 Buy the Ticket 卡特蘭數
i++ ava () pos str mat bre == ann 設50元的人為+1 100元的人為-1 滿足前隨意k個人的和大於等於0 卡特蘭數 C(n+m, m)-C(n+m, m+1)*n!*m! import java.math.*; import java
HDU 1134 Game of Connections(卡特蘭數)
cut res ras sam eof cpp ont des tel 題目代號:HDU 1134 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 200
bzoj2822[AHOI2012]樹屋階梯(卡特蘭數)
n+1 amp nbsp put mat pan cat limit 一個 2822: [AHOI2012]樹屋階梯 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 879 Solved: 513[Submit][Sta
【BZOJ 2822】[AHOI2012]樹屋階梯 卡特蘭數+高精
div cnblogs operator line code clu while pan .... 這道題隨便弄幾個數就發現是卡特蘭數然而為什麽是呢? 我們發現我們在增加一列時,如果這一個東西(那一列)他就一格,那麽就是上一次的方案數,並沒有任何改變,他占滿了也是,然後他
【專題】計數問題(排列組合,容斥原理,卡特蘭數)
spl 狀態 ans 補集 方便 常用 括號 inf 不存在 ---下面都是學習的筆記,還沒有整理,比較淩亂,有需自取吧。--- 【排列組合】 <加法原理>做一件事情有n個方法,第i個方法有pi種方案,則一共有p1+p2+...+pn種方案。 <乘法原理&
卡特蘭數相關問題
計數問題 steps str 多少 gin svg tex day src 一、什麽是Catalan數 說到Catalan數,就不得不提及Catalan序列,Catalan序列是一個整數序列,其通項公式是 遞推公式是 C(n) = C(1)*C(n-1) + C(
淺談求卡特蘭數的幾種方法
ade ++i return can 輸出 很好 include using 範圍 卡特蘭數是一個很常見的數列,以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)的名字來命名,其前幾項為 : 1, 1, 2, 5, 14,
N個節點的二叉樹有多少種形態(卡特蘭數)
面試 誤區 樹的定義 節點 類型 基礎 更多 大於等於 證明 這是一道阿裏的面試題。其實算不上新鮮,但是我之前沒關註過,如今碰到了,就順便探討下這個問題吧:) 拿到這個題,首先想到的是直接寫出表達式肯定不行,所以有必要從遞推入手。由特殊到一般,歸納法麽~而且二叉樹離不開遞推
卡特蘭數小結
bbc dstat ati 分享 分享圖片 ali 加油 lin fighting 卡特蘭數 卡特蘭數通項公式: h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2) h(n)=h(n-1
[NOIP模擬賽7.9]fseq:卡特蘭數
stdout pen clas 1.0 卡特蘭 c代碼 open -- 就是 卡特蘭數裸題,太裸了。 (可我就是錯了QwQ,忘了特判n<m的情況) AC代碼: #include <cstdio> #include <cstdlib> int n