Cod sursa(job #956504)

Utilizator t0nyukukyusuf hakan kalayci t0nyukuk Data 3 iunie 2013 11:49:37
Problema NumMst Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
//TC

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>

#define forn(a,b,c) for(int (a)=(b);(a)<=(c);(a)++)
#define forr(a,b,c) for(int (a)=(b);(a)>=(c);(a)--)
#define foreach(a,b) for( typeof( (b).begin() ) a=(b).begin(); (a)!=(b).end() ; (a)++ )
#define foreachr(a,b) for( typeof( (b).rbegin() ) a=(b).rbegin(); (a)!=(b).rend() ; (a)++ )
#define dg(x)  cerr <<#x<<':'<<x<<" "
#define dbg(x)  cerr <<#x<<':'<<x<<endl
#define SET(A,b) memset(A,b,sizeof (A) )
#define SIZE(A) ((int)(A).size())
#define ALL(A) (A).begin(),(A).end()
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define num(a) (1LL<<(a))
using namespace std;

typedef double dbl;
typedef long long Lint;
typedef pair<int,int> ii;
typedef pair<Lint,Lint> Lii;

const int MAXN = 5000;

Lint dn[MAXN];
int dad[MAXN];
bool prime[MAXN];

int main(){
	
	freopen("nummst.in","r",stdin);
	freopen("nummst.out","w",stdout);
	
	int N;
	
	scanf(" %d",&N);
	
	int X,T;
	
	forn(i,2,N)
		if(N%i==0)
		{
			T=N/i;
			X=i;
			
			prime[0]=1;
			forn(j,2,X)
				if(!prime[j])
				{
					for(int t=j*2;t<=X;t+=j)
						prime[t]=true;
				}
			
			//~ dbg(X);
			//~ dbg(T);
			
			dn[0]=1;
			dn[1]=1;
			
			forn(j,1,X)
				if(!prime[j])
					forr(t,X,0)
						if(t+j<=X && dn[t]*j>dn[t+j] && (j!=X || t!=0))
							dn[t+j]=dn[t]*j,dad[t+j]=t;
			
			//~ forn(j,1,X)
				//~ printf("%Ld ",dn[j]);
			//~ puts("");
			
			forn(j,1,X)
				if(dn[i-1]>dn[i])
					dn[i]=dn[i-1],dad[i]=dad[i-1];
			
			while(X)
			{
				printf("%Ld ",(N/i)*(Lint)(X-dad[X]));
				X=dad[X];
			}
			
			puts("");

			return 0;
			
		}
	
	return 0;
	
}