Pagini recente » Cod sursa (job #3139543) | Cod sursa (job #1971556) | Cod sursa (job #2037563) | Cod sursa (job #602871) | Cod sursa (job #585952)
Cod sursa(job #585952)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("nummst.in");
ofstream out("nummst.out");
const int N = 350005;
const int M = 5000001;
int n;
int dv;
int dc;
int cm;
int pcm;
int rcm;
int div[N];
int sol[N];
int bSol[N];
bool ciur[M];
int GetDiv()
{
for (int i = 2; i <= n; ++i)
if (n % i == 0)
return i;
}
void SetDiv()
{
for (int i = 2; i < dv; ++i)
if (!ciur[i])
{
div[++dc] = i;
//out << div[dc] << "\n";
for (int j = i + i; j < dv; j += i)
ciur[j] = true;
}
}
void Check(int pos, int rem)
{
int bAct = 1;
for (int i = 1; i < pos; ++i)
if (sol[i])
bAct *= sol[i] * div[i];
if (bAct > cm)
{
cm = bAct;
pcm = pos;
rcm = rem;
for (int i = 1; i < pos; ++i)
bSol[i] = sol[i];
}
}
void GoDiv(int pos, int rem)
{
if (pos > dc || rem < div[pos])
{
Check(pos, rem);
return;
}
for (int i = 0; i * div[pos] <= rem; ++i)
{
sol[pos] = i;
GoDiv(pos + 1, rem - i * div[pos]);
}
}
void Print()
{
int kk = n / dv;
for (int i = 1; i < pcm; ++i)
if (bSol[i])
out << bSol[i] * div[i] * kk << " ";
if (rcm)
out << rcm * kk << "\n";
}
int main()
{
in >> n;
dv = GetDiv();
// out << dv << "\n"; DV e bun
if(dv == 2)
{
out << n/2 << " " << n/2 << "\n";
return 0;
}
SetDiv();
GoDiv(1, dv);
Print();
return 0;
}