Cod sursa(job #3350461)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 8 aprilie 2026 12:06:17
Problema NumMst Scor 31
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=100'005;
constexpr ll MOD=1'000'000'007;

constexpr int P=77;
constexpr int primes[P]={2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389};
constexpr int CMAX=7;
constexpr ll BASE=1LL<<50;
constexpr int SMAX=4000;

struct nr
{
	int N;
	ll v[CMAX];

	nr()
	{
		N=1;
		memset(v, 0, sizeof(v));
	}

	nr(ll x)
	{
		N=0;
		memset(v, 0, sizeof(v));
		do
		{
			v[N++]=x%BASE;
		}while(x/=BASE);
	}

	friend bool operator<(const nr& a, const nr& b)
	{
		if(a.N!=b.N)
			return a.N<b.N;
		for(int i=a.N-1;i>-1;--i)
			if(a.v[i]!=b.v[i])
				return a.v[i]<b.v[i];
		return 0;
	}

	friend nr operator*(const nr& a, int x)
	{
		nr b;
		ll t;

		for(b.N=t=0;b.N<a.N || t;++b.N)
		{
			t+=a.v[b.N]*x;
			b.v[b.N]=t%BASE;
			t/=BASE;
		}

		return b;
	}
};

nr dp[P+1][SMAX];
int chosen[P+1][SMAX];

void getSol(int S, FILE* out, int mult)
{
	int i, j, pow, sum, sumMax, primMax;

	dp[0][0]=nr(1);
	for(i=0;i<P;++i)
		for(sum=0;sum<=S;++sum)
			for(pow=1;pow<=sum;pow*=primes[i])
			{
				nr x=dp[i][sum-pow]*pow;
				if(dp[i+1][sum]<x)
				{
					dp[i+1][sum]=x;
					chosen[i+1][sum]=pow;
				}
			}

	sumMax=primMax=0;
	for(i=1;i<=P;++i)
		for(j=0;j<=S;++j)
			if(dp[primMax][sumMax]<dp[i][j])
			{
				primMax=i;
				sumMax=j;
			}

	i=primMax;
	j=sumMax;

	if(j<S)
		fprintf(out, "%d ", (S-j)*mult);

	while(i>0)
	{
		fprintf(out, "%d ", chosen[i][j]*mult);
		j-=chosen[i][j];
		--i;
	}
	fprintf(out, "\n");
}

bool isPrime(int x)
{
	if(x<2 || (x>2 && x%2==0))
		return 0;
	for(int d=3;d*d<=x;d+=2)
		if(x%d==0)
			return 0;
	return 1;
}

int main()
{
	FILE* f=fopen("nummst.in", "r"), *g=fopen("nummst.out", "w");
	int N, d;

	// for(d=2;d<6000;++d)
		// if(isPrime(d))
			// printf("%d, ", d);

	fscanf(f, "%d", &N);

	if(N%2==0)
		fprintf(g, "%d %d\n", N/2, N/2);
	else
		for(d=3;d*d<=N;++d)
			if(N%d==0)
			{
				getSol(d, g, N/d);
				break;
			}

	fclose(f);
	fclose(g);
	return 0;
}