Pagini recente » Cod sursa (job #231082) | Cod sursa (job #1396638) | Cod sursa (job #2126901) | Cod sursa (job #2818594) | Cod sursa (job #586822)
Cod sursa(job #586822)
#include <stdio.h>
#include <math.h>
#define MAXN 3162
#define NUM_PRIME 446
char bad[MAXN + 1];
short int primes[NUM_PRIME + 1];
double bst[MAXN + 1][NUM_PRIME + 1];
short int p[MAXN + 1][NUM_PRIME + 1];
inline void redo_it(int N, int pr, int mult) {
if (pr == 0) {
for (; N; N--) {
printf("%d ", mult);
}
return;
}
int cur = p[N][pr];
printf("%d ", cur * mult);
for (; cur % primes[pr] != 0; pr -= 1);
redo_it(N - cur, pr - 1, mult);
}
inline void solve(int N, int mult) {
int i, j, k;
bst[0][0] = 0;
for (i = 1; i <= N; i++) {
bst[i][0] = 0;
for (j = 1; j <= primes[0] && primes[j] < N; j++) {
bst[i][j] = bst[i][j - 1];
p[i][j] = p[i][j - 1];
for (k = primes[j]; k <= i; k *= primes[j]) {
double cst = bst[i - k][j - 1] + log((double)k);
if (cst > bst[i][j]) {
bst[i][j] = cst;
p[i][j] = k;
}
}
}
}
for (j = 1; j <= primes[0] && primes[j] < N; j++);
redo_it(N, j - 1, mult);
printf("\n");
}
int main() {
freopen("nummst.in", "rt", stdin);
freopen("nummst.out", "wt", stdout);
int N, i, j;
for (i = 3; i <= MAXN; i += 2) {
if (bad[i]) {
continue;
}
for (j = i * i; j <= MAXN; j += i) {
bad[j] = 1;
}
}
primes[primes[0] = 1] = 2;
for (i = 3; i <= MAXN; i += 2) {
if (!bad[i]) {
primes[++primes[0]] = i;
}
}
scanf("%d", &N);
for (i = 2; i * i <= N; i += 1 + (i != 2)) {
if (N % i == 0) {
int gcd = N / i;
solve(i, gcd);
return 0;
}
}
solve(N, 1);
printf("%d %d\n", 1, N - 1);
return 0;
}