LightOj 1067(Lucas)

lightoj 1067

題目大意:

求:

(nm)%(1e6+3);

思路:

Lucas定理,組合打表

#include <iostream>
#include <cstdio>
#define LL long long
#define MOD 1000003
#define N 1000005

using namespace std;

LL f[N];

void init(LL p)
{
    f[0] = 1;
    for (int i = 1; i <= p; i++)
    {
        f[i] = f[i - 1] * i % p;
    }
}

LL quick_Mod(LL m, LL n, LL k)    
{
    LL ans = 1;

    while (n)
    {
        if (n & 1)
        {
            ans = (ans * m) % k;
        }

        n = n >> 1;
        m = (m * m) % k;
    }

    return ans;
}

// LL Comb(LL a, LL b, LL p)
// {
//     if (a < b)
//     {
//         return 0;
//     }
//     else if (a == b)
//     {
//         return 1;
//     }
//     else if (b > a - b)
//     {
//         b = a - b;
//     }

//     LL ca = 1, cb = 1, ans = 1;

//     for (LL i = 0; i < b; i++)
//     {
//         ca = (ca * (a - i)) % p;
//         cb = (cb * (b - i)) % p;
//     }

//     ans = (ca * quick_Mod(cb, p - 2, p)) % p;

//     return ans;
// }

LL Lucas(LL n, LL m, LL p)
{
    LL ans = 1;

    while (n && m && p)
    {
        // ans = (ans * Comb(n % p, m % p, p)) % p;
        LL a = n % p;
        LL b = m % p;

        if (a < b)
        {
            return 0;
        }

        ans = (ans * f[a] * quick_Mod(f[b] * f[a - b] % p, p - 2, p)) % p;

        n /= p;
        m /= p;
    }

    return ans;
}

int main()
{
    init(MOD);

    int T;
    scanf("%d", &T);

    for (int cas = 1; cas <= T; cas++)
    {
        LL n, m;
        scanf("%lld%lld", &n, &m);

        LL ans = Lucas(n, m, MOD);

        printf("Case %d: %lld\n", cas, ans);
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章