题目大意

对于一个很大的$n,m,p$如何求$C_{n+m}^m\mod p$?

Lucas定理

若$n_i,m_i$分别是$n,m$在$p$进制下第$i$位的数字,则有

$$C_n^m\mod p=\prod_{i=0}^{\log_p m}C_{n_i}^{m_i}\mod p$$

求法

按照定理式一个一个求组合数即可。

组合数并不用批量求。故预处理出各项阶乘值,然后运用

$$C_n^m=\frac{n!}{m!(n-m)!}$$

,因为取模P,运用乘法逆元、快速乘工具求解即可。

注意事项

  • MAX_N应当为n,m的范围*2,因为n+m。
  • 求组合数时,若m>n,返回0。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std; #define ll long long
#define inv(a) Inv(a, P)
#define mult(a, b) Mult(a, b, P) const int MAX_N = 200010;
ll Fact[MAX_N];
ll P; void GetFact(int n, ll* Fact, ll p)
{
Fact[0] = 1;
for (int i = 1; i <= n; i++)
Fact[i] = Fact[i - 1] % p * i % p;
} ll Exgcd(ll a, ll b, ll& x, ll& y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = Exgcd(b, a%b, x, y);
ll tx = x;
x = y;
y = tx - a / b * y;
return d;
} ll Inv(ll a, ll p)
{
ll x, y;
Exgcd(a, p, x, y);
return (x % p + p) % p;
} ll Mult(ll a, ll b, ll p)
{
ll ans = 0;
while (b)
{
if (1 & b)
ans = (ans + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ans;
} ll Comb(ll n, ll m)
{
if (m > n)
return 0;
return mult(Fact[n], inv(mult(Fact[m], Fact[n - m])));
} ll Lucas(ll n, ll m, ll p)
{
if (m == 0)
return 1;
return Comb(n % p, m % p) * Lucas(n / p, m / p, p) % p;
} int main()
{
int caseCnt;
scanf("%d", &caseCnt);
while (caseCnt--)
{
ll n, m;
scanf("%lld%lld%lld", &n, &m, &P);
GetFact(n + m, Fact, P);
printf("%lld\n", Lucas(n + m, m, P));
}
return 0;
}

  

最新文章

  1. Ajax请求示例
  2. 用Python建立最简单的web服务器
  3. P1835 素数密度_NOI导刊2011提高(04)
  4. 《用C++语言编写一个程序,求PI的值》
  5. Dynamic Method Resolution
  6. js实现checkbox的全选/取消
  7. Oracle OEM建库实例
  8. 【原生态跨平台:ASP.NET Core 1.0(非Mono)在 Ubuntu 14.04 服务器上一对一的配置实现-篇幅1】
  9. android 拍照 onCreate() 调用两次的问题
  10. JVM性能监控与优化笔记(CPU)
  11. TempData,ViewData和ViewBag的比较
  12. xcb编译
  13. Hat's Fibonacci
  14. Holding Bin-Laden Captive!(1.多重背包 2.母函数)
  15. MySQL相关命令与备份
  16. 基于python的WGS84转百度坐标
  17. 题解-洛谷4921&amp;4931 情侣?给我烧了!(加不加强无所谓版)
  18. Leetcode 283.移动零 By Python
  19. 版本控制-git(二)
  20. (4.2)mysql备份还原——备份概述

热门文章

  1. SnackDown Online Qualifier 2017
  2. Spring Cloud (3) 服务消费者-Ribbon
  3. Laravel5.1学习笔记3 HTTP中间件
  4. (转)vuex2.0 基本使用(1) --- state
  5. Android布局需要知道的基础知识
  6. 英语之ASIC
  7. 面试回答问题要防范hr的陷阱
  8. js 响应事件
  9. Having子句用法
  10. 在Android 上运行 openCV ,并做灰度变化的一个例子