Cod sursa(job #2200620)

Utilizator cristinaveraCristina Verdeata cristinavera Data 1 mai 2018 23:39:47
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<cstdio>
#include<unordered_map>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
unordered_map<long long,int>m;
vector<long long>divi;
int dp[3005][3005];
int main(){
freopen("desc.in","r",stdin);
freopen("desc.out","w",stdout);
long long n,k,i,lim,j,first;
scanf("%lld%lld",&n,&k);
lim=(int)sqrt((double)n);
divi.push_back(0);
for(i=1;i<=lim;i++)
if (n%i==0){
divi.push_back(i);
if (i!=n/i)
divi.push_back(n/i);}
sort(divi.begin(),divi.end());
lim=divi.size()-1;
for(i=1;i<=lim;i++)
m[divi[i]]=i;
for(i=1;i<=lim;i++)
dp[1][i]=1;
for(i=2;i<=lim;i++)
for(j=lim;j>=2;j--){
dp[i][j]=dp[i][j+1];
if (divi[i]%divi[j]==0)
dp[i][j]=dp[i][j]+dp[m[divi[i]/divi[j]]][j];}
printf("%lld\n",dp[lim][2]);
first=2;
while(n!=1){
for(i=first;i<=lim;i++)
if (n%divi[i]==0){
if (dp[m[n/divi[i]]][i]<k)
k=k-dp[m[n/divi[i]]][i];
else{
printf("%lld ",divi[i]);
n=n/divi[i];
first=i;
break;}}}
return 0;}