Pagini recente » Cod sursa (job #3312151) | Cod sursa (job #2986346) | Diferente pentru problema/cbinteractiv intre reviziile 28 si 22 | Cod sursa (job #3340784) | Cod sursa (job #3316151)
#include <fstream>
#include <unordered_map>
#include <algorithm>
#define nmax 5001
using namespace std;
ifstream cin("desc.in");
ofstream cout("desc.out");
long long n,v[nmax];
int m,k,dp[nmax][nmax];
unordered_map<int,long long>poz;
int main()
{
cin>>n>>k;
if(n==1){
cout<<1<<'\n'<<1;
return 0;
}
v[++m]=n;
for(int d=2;1LL*d*d<=n;d++)
if(n%d==0){
v[++m]=d;
if(1LL*d*d!=n)
v[++m]=n/d;
}
sort(v+1,v+m+1);
for(int i=1;i<=m;i++){
dp[0][i]=1;
poz[v[i]]=i;
}
for(int i=1;i<=m;i++){
dp[i][i]=1;
for(int j=i-1;j>0;j--){
dp[i][j]=dp[i][j+1];
if(v[i]%v[j]==0)
dp[i][j]+=dp[poz[v[i]/v[j]]][j];/// se adauga numarul de posibilitati de a scrie pe v[i] ca v[j] * ( v[i] / v[j] )
}
dp[i][0]=dp[i][1];
}
cout<<dp[m][0]<<'\n';
int i=1;
while(n>1){
for(;i<=m;i++){
if(n%v[i]==0){
if(k<=dp[poz[n/v[i]]][i]){
cout<<v[i]<<" ";
n/=v[i];
break;
}
k-=dp[poz[n/v[i]]][i];
}
}
}
return 0;
}
/// dp[i][j] = nr de moduri de a scrie pe v[i] ca produs de numere din v de la 1 la j