洛谷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. VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。

    首先,这是个历史遗留问题,说起来比较复杂.其次,这个问题在微软的MSDN博客上已经专门被说起过了,英文好的请直接移步到原文:<VC++ Directories>.另外,stack over ...

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

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

  3. App调用safar

    /调用safar打开网页 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.cnblo ...

  4. 跨源资源共享(CORS)

    一.跨源的定义一个“源”有三部分组成:协议.域名.端口.任一部分不一致即为跨源.比如:(http,example.com,80)和(https,example.com,443)就是不同的源.   二. ...

  5. Spring课程 Spring入门篇 4-6 Spring bean装配之基于java的容器注解说明--@ImportResource和@Value java与properties文件交互

    1 解析 1.1 这两个注解应用在什么地方 1.2 应用方式 1.3 xml方式实现取值 2 代码演练 2.1 @ImportResource和@Value代码演练 1 解析 1.1 这两个注解应用在 ...

  6. 【代码笔记】XML深入学习:DTD约束与DTD语法(2)

    DTD语法之定义实体(了解即可) 实体分为一般实体和参数实体. 定义实体:定义变量 引用实体:使用变量 一般实体:定义实体在DTD中,实体引用在xml中. 参数实体:定义实体在DTD中,实体引用在DT ...

  7. js时间与时间戳之间的转换操作,返回天、小时、分,全家桶

    1.将时间戳转换成时间 var formatDate = function(d) {  var now = new Date(d); var year = now.getFullYear(); var ...

  8. 数据结构复习之C语言指针与结构体

    数据结构指针复习: #include <stdio.h> void main() { ] = {, , , , }; // a[3] == *(3+a) printf(+a)); // a ...

  9. html学习笔记:基本结构,排列清单,表格

    <html> <head> 基本结构,排列清单,表格 <title></title> <!--文件标题声明--> <base> ...

  10. SharePoint 2013 - System Features

    1. Embed Information & Convert to PDF 功能,在文档的preview界面(hover panel); 2. Share功能可以选择是否发送邮件 -- Don ...