Cod sursa(job #586019)

Utilizator savimSerban Andrei Stan savim Data 30 aprilie 2011 13:17:14
Problema NumMst Scor 29
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 0.87 kb
#include <stdio.h>

#define MAX_N 3500

int cmmdc, n, m;

int c[MAX_N], vine[MAX_N];

inline int cmmmdc(int a, int b) {
	int r = 0;

	while (a % b != 0) {
    	r = a % b;
		a = b;
		b = r;
	}

	return b;
}

inline int cmmmc(int x, int y) {
	int aux = cmmmdc(x, y);
	return x * y / aux;
}

void write(int x) {
	if (x == 0) {
    	printf("\n");
		return;
	}

	printf("%d ", (x - vine[x])  * cmmdc);
	write(vine[x]);
}

int main() {

	freopen("nummst.in", "r", stdin);
	freopen("nummst.out", "w", stdout);

	scanf("%d", &n);
	
	for (int i = 2; i <= n; i++)
		if (n % i == 0) {
        	cmmdc = n / i;
            m = i;
			break;
		}

	for (int i = 1; i < m; i++) {
    	c[i] = i;
		vine[i] = 0;
	}

	for (int i = 1; i <= m; i++)
		for (int j = 1; j < i; j++) {
			int val = cmmmc(c[j], i - j);

			if (val > c[i]) {
            	c[i] = val;
				vine[i] = j;
			}
		}

	write(m);

	return 0;
}