Pagini recente » Cod sursa (job #2068887) | Cod sursa (job #1694095) | Cod sursa (job #507424) | Cod sursa (job #539643) | Cod sursa (job #1341821)
#include <fstream>
#include <vector>
#include <cstring>
#define MOD 2000003
using namespace std;
ifstream fin ("sandokan.in");
ofstream fout ("sandokan.out");
int N, K, num, 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;
Ciur();
memset(fr, 0, sizeof(fr));
num = N % (K - 1);
if (num == 0) num = K - 1;
Comb(N - 1, num - 1);
long long 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;
}