组合数(模板)

1. 利用 C[i][j] = C[i-1][j-1] + C[i][j-1] 递推求解

long long C[1000][1000]; // C[i][j] 表示 C(j,i)%mod j中取i;
void Combination()
{
    memset(C, 0x0000, sizeof(C));
    for(int i = 0; i < 1000; i++)
    {
        for(int j = i; j < 1000; j++)
        {
            if(i==0) C[i][j] = 1;
            else if(i==j) C[i][j] = 1;
            else C[i][j] = (C[i-1][j-1] + C[i][j-1])%mod;
        }
    }
}

2.

#define mod 1000000007
long long A[1000000]; // A[i] 表示 i 的阶乘
long long ex(long long x, long long n) //return  x^n
{
    long long sum = 1;
    while(n)
    {
        if( n&1 )
        {
            sum *= x;
            sum %= mod;
        }
        n /= 2;
        x *= x;
        x %= mod;
    }
    return sum;
}
long long C(long long n, long long m) // return C(n, m)
{
    if(m > n || m < 0) return 0;
    return A[n]*ex(A[n-m]*A[m]%mod, mod-2)%mod;
}
void initCombination() // 先初始化 A 数组
{
    A[0] = 1;
    for(int i = 1; i <= 200000; i++)
    {
        A[i] = A[i-1]*i%mod;
    }
} 
时间: 2024-12-07 16:24:03

组合数(模板)的相关文章

组合数模板

1. 1000以内的较多组合数求解;利用C(n,m) = C(n-1,m) + C(n-1,m-1)求解: const int N = 1005; ll f[N][N]; void init(int n) { f[0][0] = 1; for(int i = 1;i <= n;i++){ f[i][0] = 1; for(int j = 1;j <= i;j++) f[i][j] = f[i-1][j] + f[i-1][j-1]; } }

组合数模板 - Lucas

2017-08-10 19:35:32 整理者:pprp 用于计算C(m,n) % p 代码如下: //lucas #include <iostream> using namespace std; typedef long long ll; //a^b%m 快速幂 int quick_power_mod(int a, int b, int m) { int result = 1; int base = a; while(b > 0) { if(b&1 == 1)//如果b是奇数

HDU 6114 Chess【逆元+组合数】(组合数模板题)

<题目链接> 题目大意: 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数.他经过思考,得出了答案.但他仍不满足,想增加一个条件:对于任何一个車A,如果有其他一个車B在它的上方(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B). 现在要问问你,满足要求的方案数是多少. Input 第一行一个正整数T,表示数据组数. 对于每组数据:一行,两个正整数N

icpc2016沈阳网络赛1003hannnnah_j’s Biological Test组合数模板题

hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description hannnnah_j is a teacher in WL High school who teaches biology. One day, she wants to test m students, thus she arra

【组合数模板】HDU 6114 Chess

http://acm.hdu.edu.cn/showproblem.php?pid=6114 [思路] 就是求C(m,n) [板] #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; con

Lucas求大数组合数模板

void init() { int i; fac[0] =1; for(i =1; i <= p; i++) fac[i] = fac[i-1]*i % p; } llg pow(llg a, llg b) { llg tmp = a % p, ans =1; while(b) { if(b &1) ans = ans * tmp % p; tmp = tmp*tmp % p; b >>=1; } return ans; } llg C(llg n, llg m) { if(m

HDU6333 莫队+组合数

题目大意: 给定n m 在n个数中最多选择m个的所有方案 #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long const int mod=1e9+7; const int N=1e5+5; /********组合数模板*********/ LL pow_mod(LL a, LL b) { LL res = 1LL; a %= mod; while(b){ if(b &

luanqibazao

#include <iostream> #include <stdio.h> #include <vector> #include <algorithm> //组合数模板 /* int C(int n, int r) { int sum = 1; for (int i = 1; i <= r; i++) { sum = sum * (n + 1 - i) / i; } return sum; } */ //---------------- //将字符串

解题报告 之 SOJ1942 Foto

解题报告 之 SOJ1942 Foto Description The election campaign just started, so PSOS decided to make some propagation. One of the representatives came with a great idea - he proposes to make an photography of their Parliament Club. Unfortunatelly, even after