组合数模板

#include <iostream>
#include <cstdio>
using namespace std;
const int MOD = 3761599;
const int MAXN = 1100010;
int e[MAXN], f[MAXN], temp[MAXN];
void init()
{
    long long t = 1;
    for (int i = 1; i < MAXN; i++)
    {
        t *= i;
        t = t % MOD;
        temp[i] = t;
    }
    temp[0] = 1;
}
int gcd(int a, int b)
{
    if (b == 0) return a;
    return gcd(b, a % b);
}
void e_gcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1, y = 0;
    }
    else
    {
        e_gcd(b, a % b, x, y);
        int l = x; x = y; y = l - a / b * y;
    }
}
int choose(int n, int m)
{
    if (m > n) return 0;
    else if(n == m) return 1;
    long long nn = temp[n], mm = (temp[m] *temp[n - m]) % MOD;
    int d = gcd(nn, mm);
    nn /= d;
    mm /= d;
    int  x, y;
    e_gcd(mm, MOD, x, y);
    x = (x + MOD) % MOD;
    return (x * nn) % MOD;
}
int cal(int n, int m)
{
    int i = 0;
    while (n > 0)
    {
        e[i++] = n % MOD;
        n = n / MOD;
    }
    int len = i;
    i = 0;
    while (m > 0)
    {
        f[i++] = m % MOD;
        m = m / MOD;
    }
    long long re = 1;
    for (int i = 0; i < len; i++)
        re = (re * choose(e[i], f[i])) % MOD;
    return (int) re;
}
int main()
{
    int n,m;
    init();
    while (cin>>n>>m)  cout<<cal(n,m)<<endl;
    return 0;
}

 

posted @ 2012-08-18 15:53  徐徐而来  阅读(173)  评论(0编辑  收藏  举报