BZOJ 1485 卡特兰数 数学

思路:

通过打表观察 这是个卡特兰数

但是它mod的数不是质数 怎么办呢

把所有数分解质因数好了

线性筛出mindiv  顺着mindiv分解质因数

复杂度$O(nlogn)$

//By SiriusRen
#include <cstdio>
using namespace std;
const int N=2000005;
int n,p,prime[N],top,mindiv[N],cnt[N];
void get_prime(){
    for(int i=2;i<=2000000;i++){
        if(!mindiv[i])prime[++top]=i,mindiv[i]=i;
        for(int j=1;j<=top&&i*prime[j]<=2000000;j++){
            mindiv[i*prime[j]]=prime[j];
            if(i%prime[j]==0)break;
        }
    }
}
int main(){
    get_prime();
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++){
        int temp=i;
        while(temp!=1)cnt[mindiv[temp]]--,temp/=mindiv[temp];
    }
    for(int i=n+2;i<=2*n;i++){
        int temp=i;
        while(temp!=1)cnt[mindiv[temp]]++,temp/=mindiv[temp];
    }
    long long ans=1;
    for(int i=1;i<=2*n;i++)
        for(int j=1;j<=cnt[i];j++)
            ans=ans*i%p;
    printf("%lld\n",ans);
}
时间: 2024-12-30 06:45:54

BZOJ 1485 卡特兰数 数学的相关文章

BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )

打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... ---------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespa

【BZOJ 2822】[AHOI2012]树屋阶梯 卡特兰数+高精

这道题随便弄几个数就发现是卡特兰数然而为什么是呢? 我们发现我们在增加一列时,如果这一个东西(那一列)他就一格,那么就是上一次的方案数,并没有任何改变,他占满了也是,然后他要是占两格呢,就是把原来的切成了n-2,和1,要是就剩一格呢,也是把原来的切成一格和n-2,因为如果一行的某一列被堵了那么这一行的开头的那个台阶表面就覆盖不到那一列..... 这个是从数学角度,由于递推公式的相似性所以是卡特兰数....... #include <cstdio> const int STD=10000; st

hdu2067 小兔的棋盘 DP/数学/卡特兰数

棋盘的一角走到另一角并且不越过对角线,卡特兰数,数据量小,可以当做dp求路径数 1 #include<stdio.h> 2 long long a[36][36]; 3 int main() 4 { 5 int n,count=0; 6 while (scanf("%d",&n)!=EOF&&n!=-1) 7 { 8 int i,j; 9 long long s; 10 count++; 11 for (i=1;i<=n;i++) a[0][i

BZOJ 2822 AHOI 2012 树屋阶梯 卡特兰数+高精度

题目大意:高精度卡特兰数. 思路:上维基上看看,有一个模型和这个题一模一样,然后就剩下水水的高精度了. (谁来教教我java... CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define BASE 10000 #define MAX 100010 using namespace std; struct BigInt{ int num

BZOJ 2822 AHOI2012 树屋阶梯 卡特兰数

题目大意:求n个矩形搭出n级阶梯的方案数 那个什么空心不能向上完全是逗你的- - 卡特兰数的应用之一- - Wiki上有说- - 具体证明不会- - 总之Python大法好- - n=int(raw_input()) temp=1 for i in range (1,n+1): temp=temp*(4*i-2)/(i+1) print temp

[数学]卡特兰数

前言 咕比赛写博客的我.哭哭. 在本篇文章的剩余部分中,我们定义\(C(n)\)为卡特兰数的第\(n\)项 定义 翻阅了一堆文章,也没找到真正的定义,暂且拿这个充当定义: \(C(n)\)表示,从原点出发,每次向x或y轴正方向移动1单位,到达点(n,n),且在移动过程中不越过第一象限平分线的移动方案数. 通项公式 我们记\(C(n)\)为卡特兰数的第\(n\)项 \[C(n)= \left( \begin{matrix}2n \\ n\end{matrix} \right) - \left( \

hunnu11562:The Triangle Division of the Convex Polygon(第n个卡特兰数取模)

Problem description   A convex polygon with n edges can be divided into several triangles by some non-intersect diagonals. We denote d(n) is the number of the different ways to divide the convex polygon. For example,when n is 6,there are 14 different

卡特兰数(转)

Catalan Number 卡特兰数 转自:http://www.mathoe.com/dispbbs.asp?boardid=89&replyid=46004&id=34522&page=1&skin=0&Star=2 关于扩展的卡特兰数:1.(n-m+1)/(n+1)*c(n+m,n)2.c[n+m][n]-c[n+m][m-1]Catalan,Eugene,Charles,卡特兰(1814-1894)比利时数学家,生于布鲁日(Brugge),早年在巴黎综合工

卡特兰数爽文讲解

这个文章是基于别的博客来讲的,反正根据自己的理解,然后写出来的.欢迎大佬吐槽. 卡特兰序列:1,1,2,5,14,42,132,429,1430...   通项就是 卡特兰数:卡特兰序列中的每一项,为卡特兰数, 既: 卡特兰数的引入: 在组合数学中有一类问题,为计数问题,比如正常的排列组合,斐波拉契数列等等都可以用来计数. 现在给出一个情景:对于一个n*n的正方形网格,每次我们都能向右或者向上移动一格,并且,路径在网格的下三角形的区域内,那么从(0,0)->(n, n)总的路径为多少? 这样的路