Problem 2020 组合

Accept: 886    Submit: 2084
Time Limit: 1000 mSec    Memory Limit : 32768
KB

Problem Description

给出组合数C(n,m), 表示从n个元素中选出m个元素的方案数。例如C(5,2) = 10, C(4,2) = 6.可是当n,m比较大的时候,C(n,m)很大!于是xiaobo希望你输出 C(n,m) mod p的值!

Input

输入数据第一行是一个正整数T,表示数据组数 (T <= 100) 接下来是T组数据,每组数据有3个正整数 n, m, p (1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数)

Output

对于每组数据,输出一个正整数,表示C(n,m) mod p的结果。

Sample Input

2 5 2 3 5 2 61

Sample Output

1 10 
未预处理阶乘(在组合数函数中写了个循环):
 #include<iostream>
using namespace std;
#include<cstdio>
#define ll long long
int t;
ll quick_mod(ll a,ll b,ll p)// a^b%p
{
a%=p;
ll ans=;
while(b)
{
if(b&)
{
b--;
ans=(ans*a)%p;
}
b>>=;
a=(a*a)%p;
}
return ans;
}
ll C(ll n, ll m,ll p)
{
if(m>n) return ;
ll ans=,a,b;
for(int i=;i<=m;++i)
{
a=(n+i-m)%p;
b=i%p;
ans=ans*(a*quick_mod(b,p-,p)%p)%p;
}
return ans;
}
ll lucas(ll n,ll m,ll p)
{
if(m==) return ;
return (lucas(n/p,m/p,p)*C(n%p,m%p,p))%p;
}
int main()
{
scanf("%d",&t);
while(t--)
{
ll n,m,p;
cin>>n>>m>>p;
cout<<lucas(n,m,p)<<endl;
}
return ;
}

预处理阶乘(有时可以加快速度,相乘时也要防止溢出):

 /*事实上,这道题目预处理阶乘,反而会更慢,因为题目中n,m都是10^9,预处理已经接近超时了*/
#include<iostream>
using namespace std;
#include<cstdio>
#define S 10000000
#define ll long long
int t;
long long f[];
void yuchuli(ll p)
{
f[]=;
for(int i=;i<=S;++i)
f[i]=f[i-]*i%p;
}
ll quick_mod(ll a,ll b,ll p)
{
a%=p;
ll ans=;
while(b)
{
if(b&)
{
b--;
ans=(ans*a)%p;
}
b>>=;
a=(a*a)%p;
}
return ans;
}
ll C(ll n, ll m,ll p)
{
if(m>n) return ;
return (f[n]*quick(f[m]*f[n-m],p-,p))%p;
}
ll lucas(ll n,ll m,ll p)
{
if(m==) return ;
return (lucas(n/p,m/p,p)*C(n%p,m%p,p))%p;
}
int main()
{
scanf("%d",&t);
while(t--)
{
ll n,m,p;
cin>>n>>m>>p;
cout<<lucas(n,m,p)<<endl;
}
return ;
}
 

lucas定理 FOJ 2020 组合的更多相关文章

  1. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

  2. FZU 2020 组合 (Lucas定理)

    题意:中文题. 析:直接运用Lucas定理即可.但是FZU好奇怪啊,我开个常数都CE,弄的工CE了十几次,在vj上还不显示. 代码如下: #pragma comment(linker, "/ ...

  3. Problem 2020 组合(FOJ)

    Problem 2020 组合 Accept: 714    Submit: 1724Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem ...

  4. Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 178  Solved: 70[Submit][Stat ...

  5. 快速求排列组合 lucas定理

    对于C(n, m) mod p.这里的n,m,p(p为素数)都很大的情况. 就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了. 一般lucas定理的p ...

  6. 【BZOJ4591】超能粒子炮·改(Lucas定理,组合计数)

    题意: 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...

  7. 【BZOJ4403】序列统计(Lucas定理,组合计数)

    题意:给定三个正整数N.L和R, 统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量. 输出答案对10^6+3取模的结果. 对于100%的数据,1≤N,L,R≤10^9,1≤T≤100, ...

  8. [bzoj4591][Shoi2015][超能粒子炮·改] (lucas定理+组合计数)

    Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...

  9. CPC23-4-K. 喵喵的神数 (数论 Lucas定理)

    喵喵的神∙数 Time Limit: 1 Sec Memory Limit: 128 MB Description 喵喵对组合数比較感兴趣,而且对计算组合数很在行. 同一时候为了追求有后宫的素养的生活 ...

随机推荐

  1. 爬虫--PyQuery

    什么是PyQuery? PyQuery 初始化 字符串初始化 from pyquery import PyQuery as pq html=""" <div> ...

  2. JS 检测客户端断网情况

    常用方法 1 navigator.onLine 2 window.addEventListener() 3 获取网络资源 4 ajax请求 1. navigator.onLine 只会在机器未连上路由 ...

  3. 无key值的json数组解析

    [    [        {            "cartId": 9223,            "factoryId": 143,          ...

  4. 商城项目(ssm+dubbo+nginx+mysql统合项目)总结(4)

    我不会在这里贴代码和详细步骤什么的,我觉得就算我把它贴出来,你们照着步骤做还是会出很多问题,我推荐你们去看一下黑马的这个视频,我个人感觉很不错,一步一步走下来可以学到很多东西.另外,视频和相关文档的话 ...

  5. python基础===如何在列表,字典,集合中根据条件筛选数据

    #常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...

  6. MySQL Warning: Using a password on the command line interface can be insecure.解决办法

    转自 http://www.cnblogs.com/sunss/p/6256706.html  被一个小朋友问到,直接公布答案: If your MySQL client/server version ...

  7. Android 反编译神器jadx的使用

    一.前言 今天介绍一个非常好用的反编译的工具 jadx .jadx 的功能非常的强大,对我而言,基本上满足日常反编译需求. jadx 优点: 图形化的界面. 拖拽式的操作. 反编译输出 Java 代码 ...

  8. QWT编译、配置、使用(Qt Creator)

    环境: Win7 32 bit / Qt Creator 3.3.1 / Qt 5.4.1 (msvc2013_opengl, 32 bit) / QWT 6.1.2 QWT, Qt Widgets ...

  9. ubuntu查看mysql版本的几种方法

    ubuntu查看mysql版本的几种方法 mysql 1:在终端下:mysql -V(大写) //代码 $ mysql -V mysql Ver 14.14 Distrib 5.5.46, for d ...

  10. 2017百度春招<有趣的排序>

    题目 度度熊有一个N个数的数组,他想将数组从小到大排好序,但是萌萌的度度熊只会下面这个操作:任取数组中的一个数然后将它放置在数组的最后一个位置.问最少操作多少次可以使得数组从小到大有序? #inclu ...