Pagini recente » Cod sursa (job #223005) | Cod sursa (job #559614) | Istoria paginii runda/corona_day2/clasament | Solutii Autumn Warmup, Runda 3 | Cod sursa (job #1341056)
#include <fstream>
#include <vector>
#include <cstring>
#define MOD 2000003
using namespace std;
ifstream fin ("sandokan.in");
ofstream fout ("sandokan.out");
int N, K, sol, fr[5010];
vector < int > V;
void Ciur()
{
V.push_back(0);
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;
}
}
}
}
int Lg_Put(int x, int p)
{
int val = 1;
while (p)
{
if (p & 1) val = val * x % MOD;
x = x * x % MOD;
p >>= 1;
}
return val;
}
int Comb(int n, int k)
{
for (int i = k + 1; i <= n; i++)
{
int nr = i, j = 1;
while (V[j] * V[j] <= nr)
{
while (nr && nr % V[j] == 0)
{
fr[V[j]]++;
nr /= V[j];
}
j++;
}
if (nr) fr[nr]++;
}
for (int i = 2; i <= n - k + 1; i++)
{
int nr = i, j = 1;
while (V[j] * V[j] <= nr)
{
while (nr && nr % V[j] == 0)
{
fr[V[j]]--;
nr /= V[j];
}
j++;
}
if (nr) fr[nr]--;
}
int val = 1;
for (int i = 2; i <= n; i++)
{
if (fr[i])
{
val = val * Lg_Put(i, fr[i]) % MOD;
}
}
return val;
}
int main()
{
fin >> N >> K;
sol = 1;
Ciur();
while (N >= K)
{
memset(fr, 0, sizeof(fr));
sol = sol * Comb(N, K) % MOD;
N = N - K + 1;
}
fout << sol << '\n';
fout.close();
return 0;
}