洛谷P3200:https://www.luogu.org/problemnew/show/P3200

思路

这题明显是卡特兰数的题型咯

一看精度有点大

如果递推卡特兰数公式要到O(n2)

可以证明得出分子可以把分母约到只剩1

那我们就可以用分解质因数的方法 把分子分母全都质因数分解

再把分母约掉 就可以直接把分子剩下的质因数乘起来即可

代码

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define maxn 200000020
ll n,P,ans=;
int p[maxn/],v[maxn/],z[maxn];
void primes(ll n)
{
ll k=;
for(ll i=;i<=n;i++)
{
if(!v[i])
{
v[i]=i;
p[++k]=i;
}
for(ll j=;j<=k;j++)
{
if(p[j]>v[i]||p[j]*i>n) break;
v[i*p[j]]=p[j];
}
}
}
ll quickpow(ll a,ll b)
{
ll ret=;
while(b)
{
if(b%==)
ret=ret*a%P;
a=a*a%P;
b/=;
}
return ret;
}
int main()
{
scanf("%lld%lld",&n,&P);
primes(*n);//建立素数表和每个数的最小因子
for(ll i=*n;i>=n+;i--)//把分子质因数分解
{
ll k=i;
while(k>)
{
z[v[k]]++;//这个质数的指数加1
k/=v[k];
}
}
for(ll i=;i<=n;i++)//把分母质因数分解
{
ll k=i;
while(k>)
{
z[v[k]]--;//约掉分子分母相同的质数
k/=v[k];
}
}
for(ll i=;i<=*n;i++)
ans=(ans*quickpow(i,z[i]))%P;//把剩下的所有数相乘
printf("%lld",ans);
}

【题解】洛谷P3200 [HNOI2009] 有趣的数列(卡特兰数+质因数分解)的更多相关文章

  1. luogu 3200 [HNOI2009]有趣的数列 卡特兰数+质因数分解

    打个表发现我们要求的就是卡特兰数的第 n 项,即 $\frac{C_{2n}^{n}}{n+1}$. 对组合数的阶乘展开,然后暴力分解质因子并开桶统计一下即可. code: #include < ...

  2. 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)

    P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...

  3. BZOJ1485: [HNOI2009]有趣的数列(Catalan数,质因数分解求组合数)

    题意 挺简洁的. 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…<a ...

  4. [HNOI2009]有趣的数列 卡特兰数

    题面:[HNOI2009]有趣的数列 题解: 观察到题目其实就是要求从长为2n的序列中选n个放在集合a,剩下的放在集合b,使得集合a和集合b中可以一一对应的使a中的元素小于b. 2种想法(实质上是一样 ...

  5. BZOJ1485:[HNOI2009]有趣的数列(卡特兰数)

    Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…&l ...

  6. [HNOI2009] 有趣的数列——卡特兰数与杨表

    [HNOI 2009] 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…&l ...

  7. bzoj 1485 [HNOI2009]有趣的数列 卡特兰数

    把排好序的序列看成一对对括号,要把他们往原数列里塞,所以就是括号序合法方案数 即为卡特兰数 f(n)=Cn2nn+1 求的时候为避免除法,可以O(n)计算每个素数出现次数,最后乘起来,打完之后发现其实 ...

  8. 【BZOJ 1485】[HNOI2009]有趣的数列 卡特兰数

    这个题我是冲着卡特兰数来的所以就没有想到什么dp,当然也没有想到用卡特兰数的原因........... 你只要求出前几项就会发现是个卡特兰数,为什么呢:我们选择地时候要选择奇数位和偶数位,相邻(一对里 ...

  9. BZOJ1485: [HNOI2009]有趣的数列(卡特兰数+快速幂)

    题目链接 传送门 题面 思路 打表可以发现前六项分别为1,2,5,12,42,132,加上\(n=0\)时的1构成了卡特兰数的前几项. 看别人的题解说把每一个数扫一遍,奇数项当成入栈,偶数项当成出栈, ...

随机推荐

  1. lua实现List及Dictionary

    转载:http://www.maosongliang.com/archives/122 参考 http://blog.csdn.net/jason_520/article/details/541736 ...

  2. FZU 1884——排火车——————【栈的模拟】

    排火车 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status P ...

  3. 【iptables】规则的试验和查看

    1.存在桥接,查看桥接访客网络规则 ebtables -L 可以看到对不同的链的策略

  4. Java原生隐藏字符-工具类

    package com.seesun2012.common.util; /** 隐藏字符-工具类 @author seesun2012@163.com */ public class HiddenCh ...

  5. JavaScript数据类型 数据转换

    JavaScript数据类型分为两种:原始类型和对象类型,原始类型有:number(数字).string(文本).boolean(布尔值).null(空).undefined(未定义):对象类型有:A ...

  6. AngularJS-自定义过滤器 ng-repeat 求和

    <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8& ...

  7. android 短期计划

    http://www.jianshu.com/p/2a9fcf3c11e4 http://www.jianshu.com/p/5f6d79323923 activity启动模式: http://www ...

  8. Implementation: Quick Sort 2014-08-19

    #include <stdio.h> void print(int *a, int start , int end); void quick_sort(int *a, int start, ...

  9. Mybatis generator 逆向生成代码

    Mybatis generator 逆向生成代码 简单介绍 本文介绍用mybatis逆向生成javaben dao接口 1.创建maven项目 创建相应的包 附上项目创建完成的图片 然后在pom.xm ...

  10. vue1.0 与 Vue2.0的一些区别 及用法

    1.Vue2.0的模板标记外必须使用元素包起来: eg:Vue1.0的写法 <!DOCTYPE html> <html> <head> <meta chars ...