Pagini recente » Cod sursa (job #2733364) | Cod sursa (job #946731) | Cod sursa (job #2532374) | Cod sursa (job #1208119) | Cod sursa (job #1804348)
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
const int nmax=3505;
int modes[nmax][nmax],sum[nmax],tot;
int i,d,j,n,newd,cost,k,p,u,m,rasp;
long long curr,key,lst,prod,nr;
long long v[nmax],ans[nmax];
bool ok;
int finds()
{
p=1;u=d;
while(u-p>1)
{
m=(p+u)/2;
if(v[m]<nr) p=m;
else u=m;
}
if(v[u-1]==nr) u--;
if(v[u]!=nr) return d+1;
return u;
}
int main()
{
ifstream f("desc.in");
ofstream g("desc.out");
f>>n>>k;
for(i=2;i*i<=n;i++)
{
d++;
v[d]=i;
}
for(i=d;i>=1;i--)
{
if((n/v[i])!=v[i])
{newd++;v[d+newd]=n/v[i];}
}
d+=newd;
d++;
v[d]=n;
for(i=1;i<=d;i++)
modes[i][i]=1;
for(i=d;i>=1;i--)
for(j=1;j<=d;j++)
{
if(v[j]%v[i]==0)
{
nr=v[j]/v[i];
modes[i][j]+=sum[finds()];
}
sum[j]=sum[j]+modes[i][j];
}
for(i=1;i<=d;i++)
tot+=modes[i][d];
lst=0;v[0]=1;prod=n;
while(prod!=1)
{
prod/=v[lst];nr=prod;curr=finds();ok=0;
ans[rasp]=v[lst];rasp++;
if(prod==1) break;
if(lst==0) lst=1;
for(i=lst;i<=d&&ok==0;i++)
{
if(prod%v[i]==0)
{
if(cost+modes[i][curr]>=k)
{
ok=1;lst=i;
}else cost+=modes[i][curr];
}
}
}
g<<tot<<'\n';
for(i=1;i<rasp;i++)
g<<ans[i]<<' ';
return 0;
}