Pagini recente » Cod sursa (job #1339759) | Cod sursa (job #1709001) | Cod sursa (job #1593270) | Cod sursa (job #1919303) | Cod sursa (job #1745526)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream cin("nummst.in");
ofstream cout("nummst.out");
const double EPS = 1e-5;
bool notPrime[5000];
double dp[600][5000];
vector<int> primes;
int main() {
int n, gcd;
cin >> n;
for (int i = 2; i < n; i++)
if (n % i == 0) {
gcd = n / i;
break;
}
n /= gcd;
if (n == 2) {
cout << gcd << " " << gcd << "\n";
return 0;
}
if (n == 3) {
cout << gcd << " " << 2 * gcd << "\n";
return 0;
}
for (int i = 2; i <= n && i <= 200; i++)
if (!notPrime[i]) {
primes.push_back(i);
for (int j = 2 * i; j <= n; j += i)
notPrime[j] = true;
}
for (int i = 0; i < primes.size(); i++) {
int p = primes[i];
for (int j = 1; j <= n; j++) {
dp[i + 1][j] = dp[i][j];
int power = 1;
while (power <= j) {
if (log(power) + dp[i][j - power] > dp[i + 1][j])
dp[i + 1][j] = log(power) + dp[i][j - power];
power *= p;
}
}
}
double lcm = 0;
int where;
for (int i = 1; i <= n; i++)
if (lcm < dp[primes.size()][i]) {
lcm = dp[primes.size()][i];
where = i;
}
if (where != n)
cout << (n - where) * gcd << " ";
for (int i = primes.size(); i >= 1; i--) {
int p = primes[i - 1];
int power = p;
while (power <= where) {
if (abs(log(power) + dp[i - 1][where - power] - dp[i][where]) <= EPS) {
cout << power * gcd << " ";
where -= power;
break;
}
power *= p;
}
}
return 0;
}