Pagini recente » Cod sursa (job #1057868) | Cod sursa (job #61197) | Cod sursa (job #1264983) | Cod sursa (job #1563294) | Cod sursa (job #1758736)
#include <bits/stdc++.h>
#define maxN 10000002
#define maxM 3264
#define maxL 502
using namespace std;
int n, d, m, prime[maxM], prv[maxL][maxM][2], ans[maxM];
bool b[maxM];
double dp[2][maxM], Log[maxM];
void read()
{
freopen("nummst.in", "r", stdin);
scanf("%d", &n);
}
void sieve()
{
int i, j;
prime[++ prime[0]] = 1;
for (i = 2; i < n; ++ i)
if (!b[i])
{
prime[++ prime[0]] = i;
for (j = i * i; j < n; j += i)
b[j] = 1;
}
}
void Dp()
{
int i, j, t = 0;
for (i = 1; i <= n; ++ i)
{
prv[1][i][0] = prv[1][i][1] = 1;
}
for (i = 1; i <= n; ++ i)
Log[i] = log10f(i);
for (i = 2; i <= prime[0]; ++ i)
{
t = !t;
for (j = 1; j <= n; ++ j)
{
dp[t][j] = 1.0 * dp[!t][j];
prv[i][j][0] = prv[i - 1][j][0];
prv[i][j][1] = prv[i - 1][j][1];
}
int val;
for (j = 1; j <= n; ++ j)
for (val = prime[i]; val <= j && val > 0; val *= prime[i])
{
double x = Log[val];
if (dp[!t][j - val] + 1.0 * x > dp[t][j])
{
dp[t][j] = dp[!t][j - val] + 1.0 * x;
prv[i][j][0] = i;
prv[i][j][1] = val;
}
}
}
}
void solve()
{
int i;
for (i = 2; i * i <= n; ++ i)
if (n % i == 0)
{
d = n / i;
break;
}
if (!d)
d = 1;
else
n = i;
sieve();
Dp();
}
void write()
{
int i = n, j = prime[0], k;
freopen("nummst.out", "w", stdout);
while (i)
{
ans[++ ans[0]] = d * prv[j][i][1];
k = prv[j][i][0];
i = i - prv[j][i][1];
if (k != 1)
j = k - 1;
}
sort(ans + 1, ans + ans[0] + 1);
for (i = 1; i <= ans[0]; ++ i)
printf("%d ", ans[i]);
}
int main()
{
read();
solve();
write();
return 0;
}