Pagini recente » Cod sursa (job #2786828) | Cod sursa (job #1401270) | Cod sursa (job #31782) | Cod sursa (job #2948292) | Cod sursa (job #1010412)
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#define INF 1000000000000000000
#define MAXDIV 3000
using namespace std;
ifstream f("desc.in");
ofstream g("desc.out");
struct Comp2{
bool operator()(pair<long long,int> a, pair<long long,int> b){
return a.first<b.first;}};
long long n,k,x,y,S;
int pd[MAXDIV][MAXDIV],sum[MAXDIV][MAXDIV];
vector<long long> dvz;
set<pair<long long,int>,Comp2> s;
set<pair<long long,int>,Comp2>::iterator it;
bool Comp(long long a,long long b){
return a>b;}
int main()
{
long long i,j;
f>>n>>k;
dvz.push_back(INF);
dvz.push_back(n);
for(i=2;i*i<=n;i++)
if(!(n%i)){
dvz.push_back(i);
if(i*i<n)
dvz.push_back(n/i);}
sort(dvz.begin(),dvz.end(),Comp);
n=dvz.size()-1;
for(i=1;i<=n;i++)
s.insert(make_pair(dvz[i],i));
for(i=n;i>=1;i--){
pd[i][i]=1;
sum[i][i]=1;
for(j=i+1;j<=n;j++){
if(dvz[i]%dvz[j]){
pd[i][j]=0;
sum[i][j]=sum[i][j-1];
continue;}
x=dvz[i]/dvz[j];
it=s.find(make_pair(x,0));
y=(*it).second;
pd[i][j]=sum[y][j]-sum[y][y-1];
if(pd[i][j]<0)
pd[i][j]=0;
sum[i][j]=sum[i][j-1]+pd[i][j];}}
g<<sum[1][n]<<'\n';
x=dvz[1];y=1;i=n;
while(1){
S=0;
for(i;S<k;S+=pd[y][i],i--);
i++;
S-=pd[y][i];
k-=S;
g<<dvz[i]<<' ';
x/=dvz[i];
if(x==1)
break;
it=s.find(make_pair(x,0));
y=(*it).second;}
f.close();
g.close();
return 0;
}