FZU 2020 :组合 【lucas】

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的值!

思路:水题,练一下lucas

#include<iostream>
#include<cstdio>
#include <math.h>
#include<algorithm>
#include<string.h>
#include<queue>
#define MOD 1000003
#define maxn 2009
#define LL long long
using namespace std;
LL mpow(LL a,LL n,LL p)
{
        if(n==0)return 1;
        if(n==1)return a%p;
        if(n&1)return (a*mpow(a,n-1,p))%p;
        else
        {
                LL u=mpow(a,n>>1,p)%p;
                return (u*u)%p;
        }
}
LL C(LL n,LL m,LL p)
{
        if(m==0)return 1;
        if(m>n-m)m=n-m;
        LL up=1,down=1;
        for(int i=1;i<=m;i++){
                up=(up*(n-i+1))%p;
                down=(down*i)%p;
        }
        return up*mpow(down,p-2,p)%p;
}
long long lucas(long long n,long long m,long long p)
{
        if(m==0)return 1;
        return C(n%p,m%p,p)*lucas(n/p,m/p,p);
}
int main()
{
        long long m,n,p;
        int t;
        scanf("%d",&t);
        while(t--)
        {
                scanf("%I64d%I64d%I64d",&n,&m,&p);
                printf("%I64d\n",lucas(n,m,p));
        }
        return 0;
}

时间: 2024-10-10 18:11:16

FZU 2020 :组合 【lucas】的相关文章

FZU 2020 组合 (Lucas定理)

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

文章标题 fzu 2020

Problem 2020 组合 Accept: 623 Submit: 1533 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 <=

Problem 2020 组合(FOJ)

Problem 2020 组合 Accept: 714    Submit: 1724Time 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,表示数据组

FZU 2020-组合(Lucas定理+逆元解决大组合数求模)

题目地址:FZU 2020 题意:求C(n,m)%p的值(1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数). 思路: 对于和并且p是素数,我们一般采用Lucas定理来解. 1).Lucas定理是用来求 C(n,m) mod p的值,p是素数.其描述为: 如果 那么得到 即 Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p) Lucas(n,0,p)=1; 2).对于大组合数求模C(N,

组合 Lucas定理

组合 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] 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 输入数据第一行是一个正

【Lucas组合数定理】组合-FZU 2020

组合 FZU-2020 题目描述 给出组合数C(n,m), 表示从n个元素中选出m个元素的方案数.例如C(5,2) = 10, C(4,2) = 6.可是当n,m比较大的时候,C(n,m)很大!于是xiaobo希望你输出 C(n,m) mod p的值! 分析 Lucas定理: 如果我们要求C(n,m)%p的值,那么 进行推导可以得到 这一道题使用Lucas定理的递归式 \[ C^n_m \ mod \ p= C^{n\ mod \ p}_{m\ mod \ p}\times C^{n\div p

重复组合+lucas

从n个元素中有重复地取r个,不计其顺序,则不同的取法有C(r,n+r-1)种. lucas模版 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define MOD 10007 #define LL long long using namespace std; LL qmod(LL a, LL b, LL c) { LL ans = 1; a = a % c

省选必知

简单列了一点 1.1 基本数据结构 1. 数组 2. 链表,双向链表 3. 队列,单调队列,双端队列 4. 栈,单调栈 1.2 中级数据结构 1. 堆 2. 并查集与带权并查集 3. hash 表 自然溢出 双hash 1.3 高级数据结构 1. 树状数组 2. 线段树,线段树合并 3. 平衡树 Treap 随机平衡二叉树 Splay 伸展树 * Scapegoat Tree 替罪羊树 4. 块状数组,块状链表 5.* 树套树 线段树套线段树 线段树套平衡树 * 平衡树套线段树 6.可并堆 左偏

待学习内容

太多了 近期: 分块 [高级数据结构] 4. 块状数组,块状链表 5.* 树套树 线段树套线段树 线段树套平衡树 * 平衡树套线段树 6.可并堆 左偏树 *配对堆 7. *KDtree,*四分树 [可持久化数据结构] 1. 可持久化线段树 @ 主席树 @ 2. * 可持久化平衡树 3. * 可持久化块状数组 [字符串相关算法及数据结构] 1. KMP @ 2. AC 自动机 3. 后缀数组 4. *后缀树 5. *后缀自动机 6. 字典树 Trie @ 7. manacher [图论] 1.K短