題目大意:
求:
思路:
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;
}