卡特兰数相关公式 :

  1. \(H_n = {C_{2n}^n \over n+1)}\)
  2. \(H_n = {(4n-2)\over n+1}\times H_{n-1}\)
  3. \(H_n = C_{2n}^n - C_{2n}^{n-1}\)
  4. $ H_n = \begin{cases} \sum_{i=1}^{n} H_{i-1} H_{n-i} & n \geq 2, n \in \mathbf{N_{+}}\ 1 & n = 0, 1 \end{cases} $

因为 \(n\le 100000\) ,所以不考虑第四种,第一种和第三种种求组合数也不可以用递推来求,而用公式的话因为要预先算出阶乘和阶乘的逆元,在此题中m不保证为质数,所以也不好计算。

对于第三种,假设以及算出了\(H_{n-1}\) 那么只需要求出\({4n-2\over n+1}\) 即可

先把 m 分解质因数,然后对于分子 \(4n-2\) ,求出m分解后的质因子的所有指数,然后对于分母\(n+1\) ,也求出m分解的质因子的所有指数,前后两个指数数组相减。剩下分子和分母与m互质的部分直接求即可,保留到递推答案pre中。

综上,当前递推的答案由一个变量pre 和一个指数数组共同记录,所以在地推出当前答案之后进行累加时,还要用pre乘所有质因子

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
typedef long long ll;
int n,m;
int cnt[N];
vector<ll> v;
void exgcd(ll a,ll b,ll& d,ll& x,ll& y) {
if(!b) {
d = a; x = 1; y = 0;
}else{
exgcd(b,a%b,d,y,x); y -= x*(a/b);
}
}
ll inv(ll a,ll n){
ll d,x,y;
exgcd(a,n,d,x,y);
return d== 1?(x+n)%n:-1;
}
void getPrime(int x){
for(int i=2;i*i<=x;i++){
if(x % i)continue;
while(x%i==0)x/=i;
v.push_back(i);
}
if(x > 1)v.push_back(x);
return;
}
int main(){
while(cin >> n >> m){
if(n == 0 && m == 0)break;
v.clear();
memset(cnt,0,sizeof cnt);
ll res = 1 % m;
ll pre = 1;
getPrime(m);//对m进行分解质因数
for(int i=2;i<=n;i++){
ll fz = 4 * i - 2, fm = i + 1;
for(int j=0;j<v.size();j++){
if(fz % v[j] == 0)
while(fz % v[j] == 0){
fz /= v[j];
cnt[j] ++;//指数++
}
}
pre = pre * fz % m;//剩余互质部分直接乘
for(int j=0;j<v.size();j++){
if(fm%v[j] == 0)
while(fm % v[j] == 0){
fm /= v[j];
cnt[j] --;//指数--
}
}
if(fm > 1) pre = pre * inv(fm,m) % m;//更新pre
ll tmp = pre;
for(int j=0;j<v.size();j++){
for(int k=1;k<=cnt[j];k++){
tmp = (tmp * v[j]) % m;//计算当前答案
}
}
res = (res + tmp) % m;
}
cout << res << endl;
}
return 0;
}

为什么不是每次直接把质因子直接计算到pre中呢,因为之后的计算中,对分母(n+1)进行分解质因数时,有可能出现不够减的情况,所以我们要一直用一个数组记录这部分和m有公因数的部分

HDU-3240(卡特兰数+分解质因数后求逆元)的更多相关文章

  1. [bzoj2822][AHOI2012]树屋阶梯 (卡特兰数+分解质因数+高精度)

    Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为 ...

  2. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m

    给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数 随后 ...

  3. HDU 4828 (卡特兰数+逆)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看 ...

  4. HDU 4828 (卡特兰数+逆元)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...

  5. hdu 5428 The Factor 分解质因数

    The Factor  Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest ...

  6. Buy the Ticket HDU 1133 卡特兰数应用+Java大数

    Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...

  7. Train Problem II HDU 1023 卡特兰数

    Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want ...

  8. 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

    题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...

  9. HDU 1023(卡特兰数 数学)

    题意是求一列连续升序的数经过一个栈之后能变成的不同顺序的数目. 开始时依然摸不着头脑,借鉴了别人的博客之后,才知道这是卡特兰数,卡特兰数的计算公式是:a( n )  =  ( ( 4*n-2 ) / ...

随机推荐

  1. MongoDB按照嵌套数组中的map的某个key无法正常排序的问题

    前阵子同事有一个需求: 在一个数组嵌套map的结构中,首先按照map中的某个key进行筛选,再按照map中的某个key进行排序,但是奇怪的是数据总是乱序的. 再检查了代码和数据之后并没有发现什么错误, ...

  2. springboot项目打war包流程

    目前,前后端分离的架构已成主流,因此使用springboot构建应用是非常快速的,项目发布到服务器上的时候,只需要打成一个jar包,然后通过命令 : java -jar jar包名称即可启动服务了:但 ...

  3. HSRP技术(热备份)学习总结

    热备份学习视频https://www.bilibili.com/video/BV1i7411G7vm?p=78 • 命令:        ○ int fa0/x        ○ standby 1 ...

  4. Supervisord进程管家

    Supervisord进程管家 Supervisord是一个守护进程的工具,当进程意外终止或服务器掉电起来后,希望进程能够自动运行,supervisord可以很好的为我们做这件事情.同时supervi ...

  5. Head First 设计模式 —— 10. 迭代器 (Iterator) 模式

    思考题 public void printMenu() { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); ArrayList ...

  6. Unity优化 1

    浅谈Unity中的GC以及优化(转) Unity 官方文档,正巧在博客园发现了已经有位大神(zblade)把原文翻译出来了,而且质量很高~,译文地址 在这里.下面我就可耻地把译文搬运了过来,作为上面思 ...

  7. 剑指offer 面试题0:高质的代码:即考虑边界条件、特殊输入和错误处理

    Q:把一个字符串转换为整数. A1:一个普通但漏洞百出的解法. int StrToInt(char* str) { int number = 0; while (*str != 0) { number ...

  8. MySQL select 查询的分页和排序

    SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][ ...

  9. linux搭建简单samba服务器

    1.安装需要的软体 yum install -y samba samba-client samba-common 2.创建samba需要的本地用户,创建samba服务使用的目录 Linux系统文件的读 ...

  10. SAP GUI用颜色区分不同的系统

    对于经常打开多个窗口的SAP用户,有时候可能同时登录了生产机.测试机和开发机,为了避免误操作,比如在测试要执行的操作,结果在生产机做了,结果可想而知. 虽然可以通过右下角查看再去判断,但是总是没有通过 ...