1. 程式人生 > >bzoj 1485: [HNOI2009]有趣的數列 卡特蘭數

bzoj 1485: [HNOI2009]有趣的數列 卡特蘭數

題意

2n滿
(1)12n2nai
(2)滿a1<a3<<a2n1滿a2<a4<<a2n
(3)a2i1a2i(1in)滿a2i1<a2i
n2nmodP
n1000000P1000000000

分析

這麼菜的題我都沒有想到。。。一頭撞死算了。
考慮每次都找最前的奇數位或最前的偶數位來放數字,但有第三個限制所以任意時刻偶數位不能多於奇數位,於是問題就變成了卡特蘭數。
直接線性篩分解質因數即可。

程式碼

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 2000005
#define LL long long
using namespace std;

int n,p,not_prime[N],prime[N],tot,low[N],s[N];

void get_prime(int n)
{
    for (int i=2;i<=n;i++)
    {
        if
(!not_prime[i]) { prime[++tot]=i;low[i]=i; } for (int j=1;j<=tot&&prime[j]*i<=n;j++) { not_prime[prime[j]*i]=1; low[i*prime[j]]=prime[j]; if (i%prime[j]==0) break; } } } void solve(int x,int y) { while
(x>1) { s[low[x]]+=y; x/=low[x]; } } int main() { scanf("%d%d",&n,&p); get_prime(n*2); for (int i=1;i<=n;i++) solve(i,-1); for (int i=n+2;i<=n*2;i++) solve(i,1); int ans=1; for (int i=2;i<=n*2;i++) for (int j=1;j<=s[i];j++) ans=(LL)ans*i%p; printf("%d",ans); return 0; }

相關推薦

BZOJ 1485: [HNOI2009]有趣數列()

傳送門 解題思路   因為總共是一個排列,那麼確定了奇數項是哪些,偶數項就確定了。怎麼判斷奇數項是否合法呢,其實由於第三個限制,可以把這個數列看成一個括號序列,奇數項為\((\),偶數項為\()\),那麼合法方案數自然是卡特蘭數了。。模數不是質數,而且\(n^2\)會超時,就只能用\(ans=\frac{

bzoj 1485: [HNOI2009]有趣數列

題意 我們稱一個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件: (1)它是從1到2n共2n個整數的一個排列ai; (2)所有的奇數項滿足a1<a3<…<a2n−1,

bzoj1485: [HNOI2009]有趣數列

50%的dp應該很好想。一看題解是卡特蘭數,我就震驚了。 我們來思考為什麼是卡特蘭數。。。 每個數只能走一次,設奇數位的為x 偶數位的為y 那麼到達(N,N)一直不能穿過直線y=x 由於路徑只能往右和往上走,所以這就是個卡特蘭數。 如果還不清楚,那麼可以理解為如果向上到(a

bzoj 1485: [HNOI2009]有趣數列

1485: [HNOI2009]有趣的數列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1226  Solved: 652 [Submit][St

BZOJ 1485 [HNOI2009]有趣數列蘭大任意模】

模數可以去任意值。 做法原理就是把數分解分解。 當然可以當作板子來記: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #inclu

「BZOJ1485」[HNOI2009] 有趣數列 數列

alt class ++ use 要求 現在 前三 inpu space 「BZOJ1485」[HNOI2009] 有趣的數列 Description 我們稱一個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件: (1)它是從1到2n共2n個整數的一

[bzoj1485][HNOI2009]有趣數列__組合數

有趣的數列 bzoj-1485 HNOI-2009 題目大意:求所有1~2n的排列滿足奇數項遞增,偶數項遞增。相鄰奇數項大於偶數項的序列個數%P。 註釋:$1\le n\le 10^6$,$1\le P \le 10^9$。 想法:好題啊。 我們依次考慮1~2n,就是把當前$i$放進奇數項還是偶數

bzoj 1485

連結:戳這裡 1485: [HNOI2009]有趣的數列 Time Limit: 10 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Description  我們稱一個長度為2n的數列是有趣的,當且僅當該數列

BZOJ 1485 [HNOI2009]有趣數列

首先將2n個數排列為序列A,從前向後選出n個作為奇數項,剩下的作為偶數項,而且選定的陣列成的有趣的數列只能有一種(選出的奇數項數字和偶數項數字要升序插入數列,排列只有一種)。要保證奇數項小於偶數項,那麼對於每一位A中的數,其前選出的奇數項的個數必然要大於等於

BZOJ 2822】[AHOI2012]樹屋階梯 +高精

div cnblogs operator line code clu while pan .... 這道題隨便弄幾個數就發現是卡特蘭數然而為什麽是呢? 我們發現我們在增加一列時,如果這一個東西(那一列)他就一格,那麽就是上一次的方案數,並沒有任何改變,他占滿了也是,然後他

【算法專題】(計數數列

n-1 映射 點分治 blog -s 方法 .org div n-k Catalan數列:1 1 1 2 5 14 42 132 429 1430 4862 16796 【計數映射思想】 參考:卡特蘭數 — 計數的映射方法的偉大勝利 計數映射:將難以統計的數映射為另一種形式

超級bzoj 4706: B君的多邊形)

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 159  Solved: 92 [Submit][Status][Discuss] Descrip

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

【專題】計數問題(排列組合,容斥原理,

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(