joj 2736: 二叉树计数 卡特兰数取模 1<=n<=10^9,1<=m<=32768

该博客探讨了如何计算含有特定数量节点的不同二叉树的总数,并将其结果对一个大素数取模。输入包括节点数量n和模数k,输出为二叉树的数量对k取模后的值。
摘要由CSDN通过智能技术生成

给出n,k.求含有n个节点的不同二叉树数目%k

Input

MULTI TEST CASE!!
每行两个整数n,k(1<=n<=10^9,1<=k<=32768)

Output

一行二叉树的数目%k

Sample Input

3 100

Sample Output

5
//师哥模板
#include <stdio.h>
#include <utility>
#include <vector>
#include <algorithm>
int Pow(int x, int b)
{
 int ret = 1;
 for(int s = x; b; b >>= 1)
 {
  if(b & 1)
   ret *= s;
  s *= s;
 }
 return ret;
}
int PowMod(int x, int b, int p)
{
 int ret = 1 % p;
 for(int s = x % p; b; b >>= 1)
 {
  if(b & 1)
  {
   ret *= s;
   ret %= p;
  }
  s *= s;
  s %= p;
 }
 return ret;
}
std::pair<int, int> ExGcd(int a, int b)
{
 if(a == 0) return std::make_pair(0, 1);
 std::pair<int, int> s = ExGcd(b % a, a);
 return std::make_pair(s.second - b / a * s.first, s.first);
}
int Inv(int a, int m) // ax == 1 mod m
{
 // assert gcd(a, m) == 1
 std::pair<int, int> s = ExGcd(a, m);
 // s.first * a + s.second * m == 1
 return s.first < 0 ? s.first + m : s.first;
}
std::pair<int, int> FacMod(int n, int p, int k)
{
 // assert p > 1, k > 0
 int pk = Pow(p, k);
 int S[pk];
 S[0] = 1 % pk;
 for(int i = 1; i < pk; ++i)
 {
  S[i] = S[i - 1];
  if(i % p != 0)
  {
   S[i] *= i;
   S[i] %= pk;
  }
 }
 int ret = 1 % pk, et = 0, ep = 0; // S[pk - 1]^et, p^ep
 while(n)
 {
  et += n / pk;
  ret *= S[n % pk];
  ret %= pk;
  ep += n / p;
  n /= p;
 }
 ret *= PowMod(S[pk - 1], et, pk);
 ret %
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值