FZU 2020 组合

来源:互联网 发布:咫尺网络代理商 编辑:程序博客网 时间:2024/05/16 11:36

题目:

http://acm.fzu.edu.cn/problem.php?pid=2020

题意:

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的结果。

思路:

Lucas定理的模板题,看的ACdreamer大佬的博客。其中在C函数中,先求出Ci1n然后推出Cin,直到求出Cmn,另外对于(a/b)modp,应当写成(a(b1modp))modp,其中b1modpbp的乘法逆元

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int N = 1010;ll mod_pow(ll a, ll b, ll p){    ll res = 1;    a %= p;    while(b)    {        if(b & 1) res = res * a % p;        b >>= 1;        a = a * a % p;    }    return res;}ll C(ll n, ll m, ll p) //从n中选出m个,即n为下标,m为上标{    if(m > n) return 0;    ll res = 1;    for(int i = 1; i <= m; i++)    {        ll a = (n - i + 1) % p;        ll b = i % p;        res = res * (a * mod_pow(b, p-2, p) % p) % p;    }    return res;}ll Lucas(ll n, ll m, ll p) //从n中选出m个,即n为下标,m为上标{    if(m == 0) return 1;    return C(n%p, m%p, p) * Lucas(n/p, m/p, p) % p;}int main(){    int t;    ll n, m, p;    scanf("%d", &t);    while(t--)    {        scanf("%I64d%I64d%I64d", &n, &m, &p);        printf("%I64d\n", Lucas(n, m, p));    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被毒蜘蛛咬了怎么办 在家被蜘蛛咬了怎么办 被蜘蛛咬了很痒怎么办 被蜘蛛咬了红肿怎么办 宝宝被蜘蛛咬了怎么办 红鹦鹉鱼产卵了怎么办 掉灰的墙面怎么办简单 辣椒上的白粉虱怎么办 巨门在父母宫怎么办 空腹吃柿子胃胀怎么办 吃了山药过敏痒怎么办 瓷砖活动了怎么办的下 家里进了大蛾子怎么办 沙漠玫瑰烂根了怎么办 打麻药的地方疼怎么办 做月子奶不够吃怎么办 坐月子手痛怎么办才好 产后胖了20斤怎么办 手动挡汽车闯动怎么办 孕妇风热感冒了怎么办 孕妇得风热感冒怎么办 小鸡站不起来了怎么办 感冒了流清鼻涕怎么办 哈士奇又吐又拉怎么办 怀孕乳房长妊娠纹怎么办 乳房长妊娠纹了怎么办 宝宝忌奶晚上哭怎么办 20岁胸下垂松软怎么办 断奶时乳房有肿块怎么办 孩子断奶后乳房变小怎么办 断奶了月经不来怎么办 钥匙在门上拔不出来怎么办 钥匙拔不下来了怎么办 养了几天鱼死了怎么办 乌龟的眼睛肿了怎么办 手被鱼刺扎了怎么办 被鱼刺扎手肿了怎么办 手被桂鱼扎了怎么办 三岁宝宝卡鱼刺怎么办 一岁宝宝卡鱼刺怎么办 鱼刺卡在胸口了怎么办