Pagini recente » Cod sursa (job #2777181) | Cod sursa (job #2289433) | Cod sursa (job #1780116) | Cod sursa (job #1716882) | Cod sursa (job #1833345)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#define MAXC 4000
using namespace std;
int cmmdc, n;
int viz[MAXC];
double lgm[MAXC];
vector<int> primes;
void solve1()
{
for (int i = 2; i*i <= n; i++)
if (n % i == 0) {
cmmdc = i;
break;
}
primes.push_back(-1);
for (int i = 2; i <= cmmdc; i++)
if (!viz[i]) {
primes.push_back(i);
for (int j = i*i; j <= cmmdc; j += i)
viz[j] = 1;
}
for (int i = 1; i < MAXC; i++)
lgm[i] = log(i);
}
double din[200][MAXC];
int drum[200][MAXC];
void solve2()
{
for (int i = 1; i < MAXC; i++)
drum[0][i] = i-1;
for (int i = 1; i < primes.size(); i++)
{
for (int j = 0; j <= cmmdc; j++)
{
if (din[i][j] < din[i-1][j]) {
din[i][j] = din[i-1][j];
drum[i][j] = j;
}
for (int k = 1; j + k <= cmmdc-(j==0); k *= primes[i]) {
if (din[i][j+k] <= din[i-1][j] + lgm[k]) {
din[i][j+k] = din[i-1][j] + lgm[k];
drum[i][j+k] = j;
}
}
}
}
}
void traseu()
{
for (int i = primes.size()-1, val = cmmdc; val; i = max(0, i-1))
{
if (drum[i][val] != val)
printf("%d ", (n/cmmdc)*(val-drum[i][val]));
val = drum[i][val];
}
}
int main()
{
freopen("nummst.in", "r", stdin);
freopen("nummst.out", "w", stdout);
scanf("%d", &n);
solve1();
solve2();
traseu();
return 0;
}