Pagini recente » Cod sursa (job #1496604) | Cod sursa (job #323566) | Cod sursa (job #1762196) | Cod sursa (job #2340672) | Cod sursa (job #1341061)
#include <fstream>
#include <vector>
#include <cstring>
#define MOD 2000003
using namespace std;
ifstream fin ("sandokan.in");
ofstream fout ("sandokan.out");
long long N, K, num, sol, fr[5010];
vector < int > V;
void Ciur()
{
for (int i = 2; i <= N; i++)
{
if (!fr[i])
{
V.push_back(i);
for (int j = i + i; j <= N; j += i)
{
fr[j] = 1;
}
}
}
}
long long Lg_Put(long long x, int p)
{
long long val = 1;
while (p)
{
if (p & 1) val = val * x % MOD;
x = x * x % MOD;
p >>= 1;
}
return val;
}
void Comb(int n, int k)
{
for (int i = k + 1; i <= n; i++)
{
int nr = i, j = 0;
while (V[j] * V[j] <= nr)
{
while (nr % V[j] == 0)
{
fr[V[j]]++;
nr /= V[j];
}
j++;
}
if (nr > 1) fr[nr]++;
}
for (int i = 2; i <= n - k; i++)
{
int nr = i, j = 0;
while (V[j] * V[j] <= nr)
{
while (nr % V[j] == 0)
{
fr[V[j]]--;
nr /= V[j];
}
j++;
}
if (nr > 1) fr[nr]--;
}
}
int main()
{
fin >> N >> K;
num = N;
Ciur();
memset(fr, 0, sizeof(fr));
while (N >= K)
{
Comb(N, K);
N = N - K + 1;
}
sol = 1;
for (int i = 2; i <= num; i++)
{
if (fr[i])
{
sol = sol * Lg_Put(i, fr[i]) % MOD;
}
}
fout << sol << '\n';
fout.close();
return 0;
}