Pagini recente » Cod sursa (job #49140) | Cod sursa (job #667216) | Cod sursa (job #693520) | Cod sursa (job #638336) | Cod sursa (job #2527596)
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define DIMN 10000
using namespace std;
int elem;
int c[DIMN] , sol[DIMN];
int prm[DIMN];
double rcs[600][4010];
pair <double , int> maxi[4010];
int tt[600][4010];
void ciur (int n){
int i , j;
for (i = 2 ; i <= n ; i++){
if (!c[i]){
prm[++elem] = i;
for (j = i*i ; j <= n ; j += i){
c[j] = 1;
}
}
}
}
int main()
{
FILE *fin = fopen ("nummst.in","r");
FILE *fout = fopen ("nummst.out","w");
int n , d , dmare , i , j , nr , sum , dmic;
fscanf (fin,"%d",&n);
d = 2;
while (d * d <= n){
if (n % d == 0){
dmare = n / d;
dmic = d;
break;
}
d++;
}
/// suma trb sa fie dmic , adica acum n
n /= dmare;
ciur (n);
//cout <<log((double)8); //+ log((double)3)+log((double)5)+log((double)7);
for (i = 1 ; i <= elem ; i++){
for (j = 0 ; j <= n ; j++){ /// iau de la un nr prim anterior
rcs[i][j] = rcs[i-1][j]; /// tot o sa faci un maxi
tt[i][j] = tt[i-1][j];
}
for (nr = prm[i] ; nr < n ; nr *= prm[i]){
for (j = n - nr ; j>=0 ; j--){ /// iau de la un nr prim anterior
if (rcs[i-1][j] + log((double)nr) > rcs[i][j + nr]){
rcs[i][j + nr] = rcs[i-1][j] + log((double)nr);
tt[i][j + nr] = j;
}
}
}
}
sum = n;
int poz = elem;
int xc = 0;
int s = 0;
while (sum && poz){
if (tt[poz][sum] && tt[poz][sum] == tt[poz - 1][sum])
poz--; /// aici stii ca nu ai luat
else {
fprintf (fout,"%d ",(sum - tt[poz][sum]) * dmare);
s += sum - tt[poz][sum];
sum = tt[poz][sum];
poz--;
}
}
while (s < dmic){
fprintf (fout,"%d ",dmare);
s++;
}
return 0;
}