洛谷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. android应用签名详解

    1.Eclipse工程中右键工程,弹出选项中选择 android工具-生成签名应用包: 2.选择需要打包的android项目工程: 3.如果已有私钥文件,选择私钥文件 输入密码,如果没有私钥文件见 第 ...

  2. nyoj 206——矩形的个数——————【dp或公式】

    矩形的个数 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3 ...

  3. 原生js与jquery的区别

    1.选择器: js: $('.car_img_con img')[0]; var jsObj = document.getElementsByClassName('sel_index_block')[ ...

  4. 07.使用FileStream类来实现对大文件的复制

    namespace _20.使用FileStream类来实现多媒体文件的复制 { class Program { static void Main(string[] args) { //需要被复制的文 ...

  5. Java循环结构之while和do-while循环

    循环结构知识点 本章技能目标 1理解循环的含义 2会使用while循环 3会使用do-while循环 4会使用调试解决简单的程序错误 一.   循环的含义 循环就是重复的做……(Java程序中的循环结 ...

  6. zookeeper入门教程

    zookeeper使用场景,不是很难了解,感觉zk监听节点变化,这个功能比较厉害.zk存储的节点组织结构有点像unix文件系统 1.安装zk 运行环境 centos 7 java 8 zookeepe ...

  7. PAT 1036 Boys vs Girls

    #include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> ...

  8. Drupal theme_hook

    模板语言和主题引擎 用Drupal的行话来说,主题就是一组负责你站点外观的文件.你可以从http://drupal.org/project/Themes下载第 3方主题,或者你可以自己动手创建一个主题 ...

  9. SharePoint Tricks

    1. 64位IE浏览器无法使用Open with Explorer功能,而且会直接用浏览器去打开office文件(不管是否选择使用客户端打开) 2. 对于 large list or library, ...

  10. solidity语言11

    函数修饰符 pragma solidity ^0.4.11; contract owned { address owner; // 构造函数 function owned() public { own ...