Cod sursa(job #2588274)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 24 martie 2020 16:47:36
Problema NumMst Scor 12
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("nummst.in");
ofstream g("nummst.out");

int n , cn ;
int dic , nr ;
int v[4000] , prime[1000] , tr ;
bool ciur[4000] ;

int main()
{
f >> n ;
cn = n ;
for( int i=2 ; i*i<=n ; i++ ){
  if( n%i==0 ){
   dic = i ;
   break;
  }
}
///20 de puncte?
if( dic<5 )
 g<<cn/dic<<" "<<cn-cn/dic;
else{
 int rest = dic , maxim = 0 , ind = 0 ;
 for(int i=0 ; i<=rest ; i++)
  v[i] = 1 ;
 v[2] = 2 ; v[3] = 2 ; v[4] = 2 ;
 for(int i=2 ; i<=rest ; i++){
   if(ciur[i]==0){
    tr++ ; prime[tr]=i ;
    for(int j=i+i ; j<=rest ; j+=i ){
      ciur[j] = 1 ;
    }
   }
 }
 for(int i=tr ; i>=2 ; i--){
  for(int j=rest ; j>=prime[i] ; j--){
    if( v[j] < v[j-prime[i]]*prime[i] && v[j-prime[i]]*prime[i] <= 1000 )
     v[j] = v[j-prime[i]]*prime[i] ;
  }
 }
 for(int i=1 ; i<=dic ; i++){
   if (v[i]>maxim){
    maxim = v[i] ;
    ind = i ;
  }
 }
 for(int i=1 ; i<=rest-ind ; i++){
  g<<cn/dic<<" ";
 }

 for(int i=2 ; i<=maxim/2 ; i++){
  if( maxim%i==0 ){
   g<<i*cn/rest<<" ";
   maxim/=i;
  }
 }
 if(maxim)
  g<<maxim*cn/rest;
}
}