Pagini recente » Cod sursa (job #1108728) | Cod sursa (job #1605175) | Cod sursa (job #890660) | Cod sursa (job #1187907) | Cod sursa (job #1765027)
#include <cstdio>
#include <cmath>
#define MAXDIV 5000
#define MAXSQRT 1000000
int dp[MAXDIV+1][MAXDIV+1];
long long div[MAXDIV*3];
char vf[MAXSQRT+1];
int main(){
FILE*fi,*fout;
int x,m,i,j,k,poz,flag;
long long n,d;
fi=fopen("desc.in" ,"r");
fout=fopen("desc.out" ,"w");
fscanf(fi,"%lld %d " ,&n,&k);
d=2;
x=sqrt(n);
m=0;
while(d<=x){
if(n%d==0){
div[++m]=d;
vf[d]=1;
}
d++;
}
d--;
if(d*d==n)
d--;
while(d>1){
if(vf[d]==1)
div[++m]=n/d;
d--;
}
div[++m]=n;
div[0]=1;
// for(i=0;i<=m;i++)
// printf("%lld " ,div[i]);
for(i=1; i<=m; i++)
dp[0][i]=1;
for(i=1; i<=m; i++){
poz=0;
for(j=m; j>=1; j--){
d=div[i]/div[j];
dp[i][j]=dp[i][j+1];
if(d*div[j]==div[i]){
while(poz<=m&&div[poz]<d)
poz++;
if(div[poz]==d)
dp[i][j]+=dp[poz][j];
}
}
}
fprintf(fout,"%d\n" ,dp[m][1]);
i=1;
poz=m;
while(n>1){
if(n%div[i]==0){
d=n/div[i];
while(poz>=0&&div[poz]>d)
poz--;
if(k>dp[poz][i]){
k-=dp[poz][i];
i++;
}
else{
fprintf(fout,"%lld " ,div[i]);
n/=div[i];
}
}
else
i++;
}
fclose(fi);
fclose(fout);
return 0;
}