东北育才 DAY2组合数取mod (comb)

Posted ashon37w

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了东北育才 DAY2组合数取mod (comb)相关的知识,希望对你有一定的参考价值。

组合数取模(comb)

【问题描述】

计算C(m,n)mod 9901的值

【输入格式】

从文件comb.in中输入数据。

输入的第一行包含两个整数,m和n

【输出格式】

输出到文件comb.out中。

输出一行,一个整数

【样例输入】

2 1

【样例输出】

2

【数据规模与约定】

对于 20%的数据,n<=m<=20

对于 40%的数据,n<=m<=2000

对于 100%的数据,n<=m<=20000

 

 

这道题描述很清楚,有很多种做法,第一题还是挺水的,而且很多网站上也有

自己比较懒,因为摸的数很小,写了一个半打表半lucas。

 

#include<iostream> 
#include<cstring> 
#include<cstdio> 
using namespace std; 
int C[9902][9902]; 
int main() 
{ 
    int i,j; 
    int n,m; 
    cin>>n>>m; 
    for(i=0;i<=9901;i++) 
    { 
        C[i][i]=1; 
        C[i][1]=1; 
        C[i][0]=1; 
    } 
    for(i=2;i<=9901;i++) 
    { 
        for(j=1;j<=i;j++) 
        { 
            C[i][j]=((C[i-1][j-1])%9901+(C[i-1][j])%9901)%9901; 
        } 
    } 
    int ans=0; 
    ans=(C[n/9901][m/9901]*C[n%9901][m%9901])%9901; 
    cout<<ans; 
}

 

 

 

还有一种是直接lucas..

 

#include<iostream> 
#include<cstring> 
#include<cstdio> 
using namespace std; 
typedef long long LL; 
LL n,m,p; 
LL quick_mod(LL a, LL b) 
{ 
    LL ans=1; 
    a%=p; 
    while(b) 
    { 
        if(b&1) 
        { 
            ans=ans*a%p; 
            b--; 
        } 
        b>>=1; 
        a=a*a%p; 
    } 
    return ans; 
} 
LL C(LL n, LL m) 
{ 
    if(m>n)
    return 0; 
    LL ans=1; 
    for(int i=1; i<=m; i++) 
    { 
        LL a=(n+i-m)%p; 
        LL b=i%p; 
        ans=ans*(a*quick_mod(b,p-2)%p)%p; 
    } 
    return ans; 
} 
LL Lucas(LL n, LL m) 
{ 
    if(m == 0)
    return 1; 
    return C(n%p,m%p)*Lucas(n/p,m/p)%p; 
} 
int main() 
{ 
    scanf("%lld%lld", &n, &m); 
    p=9901; 
    printf("%lld\n", Lucas(n,m)); 
    return 0; 
}

 

还有一种是直接打表..这里发一下我旁边dalao写的程序

#include<iostream> 
#include<cstring> 
#include<cstdio> 
using namespace std; 
typedef long long LL; 
LL n,m,p; 
LL quick_mod(LL a, LL b) 
{ 
    LL ans=1; 
    a%=p; 
    while(b) 
    { 
        if(b&1) 
        { 
            ans=ans*a%p; 
            b--; 
        } 
        b>>=1; 
        a=a*a%p; 
    } 
    return ans; 
} 
LL C(LL n, LL m) 
{ 
    if(m > n) return 0; 
    LL ans = 1; 
    for(int i=1; i<=m; i++) 
    { 
        LL a = (n + i - m) % p; 
        LL b = i % p; 
        ans = ans * (a * quick_mod(b, p-2) % p) % p; 
    } 
    return ans; 
} 
LL Lucas(LL n, LL m) 
{ 
    if(m == 0) return 1; 
    return C(n % p, m % p) * Lucas(n / p, m / p) % p; 
} 
int main() 
{ 
    scanf("%lld%lld", &n, &m); 
    p=9901; 
    printf("%lld\n", Lucas(n,m)); 
    return 0; 
}

以上是关于东北育才 DAY2组合数取mod (comb)的主要内容,如果未能解决你的问题,请参考以下文章

东北育才 第9天

东北育才 NOIP模拟赛第1场

组合数取mod

组合数取模

对组合数取模

东北育才10天大总结