LightOj 1067(Lucas)

来源:互联网 发布:vc tcp socket编程 编辑:程序博客网 时间:2024/05/24 15:36

lightoj 1067

题目大意:

求:

(nm)%(1e6+3);

思路:

Lucas定理,组合打表

#include <iostream>#include <cstdio>#define LL long long#define MOD 1000003#define N 1000005using 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;}
0 0
原创粉丝点击