题目描述

小a是一个健忘的人,由于他经常忘记做作业,因此老师对他很恼火。
小a马上就要开学了,他学期一共2n

天,对于第i天,他有可能写了作业,也可能没写作业,不过他自己心里还有点B数,因此他会写恰好n天的作业
现在,小a需要安排他的学期计划,如果小a的学期中存在一天x,在这之前的x天中,他没写作业的天数 - 写作业的天数⩾k

,那么老师就会把它开除,我们称这是一种不合法的方案
小a想知道他有多少种合法的方案

输入描述:

第一行三个整数n,k,p,p表示对p取模

输出描述:

一个整数表示答案
示例1

输入

2 1 100007

输出

2

说明

总共有2n=4

合法的方案有
写了 没写 写了 没写
写了 写了 没写 没写
注意:没写 写了 没写 写了 是一种不合法的方案,因为在第一天时没写的天数-写了的天数⩾1
 
示例2

输入

10 5 10000007

输出

169252

思路:在x位置之前出现m+k个不读书,m个读书则为不合法序列,将后面的不读书和读书互换,则该序列中含有n+k个不读书和n-k个读书

合法方案$C^{n}_{2n}$ 不合法方案$C^{n+k}_{2n}$ 答案相减即可

因为p不一定为质数,所以不能直接做。

$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\right) !}$ 把上下所有质因子的指数求出来,在快速幂算即可。

#include <bits/stdc++.h>
#define ll long long
using namespace std; template<typename T>
inline void read(T &x) {
x = ;T f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
x *= f;
} const int N = 2e6;
ll MOD, n, m;
bool vis[N + ];
int prime[N], prin; void getpri() {
for (int i = ; i <= N; i++) {
if (!vis[i]) prime[++prin] = i;
for (int j = ; j <= prin && i * prime[j] <= N; j++) {
vis[i * prime[j]] = ;
if (i % prime[j] == ) break;
}
}
} ll qp(ll a, ll b) {
ll res = ;
while (b) {
if (b & ) res = res * a % MOD;
a = a * a % MOD;
b >>= ;
}
return res;
} // 计算x!中素因子p的指数
ll cal(ll x, ll p) {
ll res = ;
ll temp = p;
while (x >= temp) {
res += x / temp;
temp *= p;
}
return res;
} ll solve(ll n, ll m) {
ll ans = ;
for (int i = ; i <= prin && prime[i] <= n; i++) {
ll cnt = cal(n, prime[i]) - cal(m, prime[i]) - cal(n - m, prime[i]);
ans = (ans * qp(prime[i], cnt)) % MOD;
}
return ans;
} int main() {
getpri();
read(n); read(m); read(MOD);
printf("%lld\n", (solve(n * , n) - solve(n * , n + m) + MOD) % MOD);
return ;
}

小a的学期 (组合数取模模板)的更多相关文章

  1. 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数

    typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1&l ...

  2. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...

  3. hdu 3944 DP? 组合数取模(Lucas定理+预处理+帕斯卡公式优化)

    DP? Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0 ...

  4. 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)

    J. Ceizenpok’s formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. BZOJ_2142_礼物_扩展lucas+组合数取模+CRT

    BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...

  6. 组合数取模&&Lucas定理题集

    题集链接: https://cn.vjudge.net/contest/231988 解题之前请先了解组合数取模和Lucas定理 A : FZU-2020  输出组合数C(n, m) mod p (1 ...

  7. Uva12034 (组合数取模)

    题意:两匹马比赛有三种比赛结果,n匹马比赛的所有可能结果总数 解法: 设答案是f[n],则假设第一名有i个人,有C(n,i)种可能,接下来还有f(n-i)种可能性,因此答案为 ΣC(n,i)f(n-i ...

  8. 排列组合+组合数取模 HDU 5894

    // 排列组合+组合数取模 HDU 5894 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 // 思路: // 定好m个人 相邻人之间k个座位 剩下就剩n-( ...

  9. [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

    题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...

随机推荐

  1. Python知识之 方法与函数、偏函数、轮询和长轮询、流量削峰、乐观锁与悲观锁

    方法与函数 函数需要手动传参self.cls,方法自动传,比如对象方法自动传self,类方法自动传cls,而函数相对而言需要手动传,比如静态绑定的函数,self是需要手动传值得,比如我们平常使用的函数 ...

  2. C++ Primer中文第四版

    C++ Primer中文第四版 在简书上发现有挂羊头卖狗肉的,发的plus,而且压缩包还得付钱获取密码,我直接去github搜到了第四版,在此分享一下.   格式:pdf 书签目录:有   下载地址: ...

  3. JAVA知识点总结篇(一)

    JVM(Java Virtual Machine):源文件->编译器->字节码文件->解释器->程序: JDK:Java Development Kit,Java开发工具包: ...

  4. C语言conio.h部分解释

    #include <conio.h> int getch(void);// 从控制台得到下一个字符,以ASCII值返回,并不在屏幕显示该字符 int getche(void);// 从控制 ...

  5. js获取对象的属性个数

    for (var i = 0; i < dt.length; i++) { if (Object.keys(dt[i]).length <= 1) { dt.splice(i, 1); i ...

  6. 在.net core中数据操作的两种方式(Db first && Code first)

    在开发过程中我们通常使用的是Db first这种模式,而在.net core 中推荐使用的却是 code first 反正我是很不习惯这种开发模式 于是就搜寻整个微软的官方文档,终于找到了有关.net ...

  7. HTTP协议的认识

    1.内容回顾 1.HTTP协议消息的格式: 1.请求(request) 请求方法 路径 HTTP/1.1 \r\n k1:v1\r\n ...\r\n \r\n 请求体 <--这里可以有可以没有 ...

  8. k8s--scope.yaml

  9. StopWatch方法详解

    namespace System.Diagnostics { // // 摘要: // 提供一组方法和属性,可用于准确地测量运行时间. public class Stopwatch { // // 摘 ...

  10. pandas-06 Series和Dataframe的排序操作

    pandas-06 Series和Dataframe的排序操作 对pandas中的Series和Dataframe进行排序,主要使用sort_values()和sort_index(). DataFr ...