Cod sursa(job #2615152)

Utilizator MohamedAhmed04Mohamed Ahmed Ali Mohamed Bakry MohamedAhmed04 Data 13 mai 2020 18:50:38
Problema Descompuneri Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std ;
using namespace __gnu_pbds ;

struct custom_hash 
{
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

const int MAX = 1e4 ;

long long n, k ;

vector<long long>factors ;

gp_hash_table<long long, int , custom_hash>pos ;

void factorize()
{
	for(long long i = 1ll ; i * i <= n ; ++i)
	{
		if(n%i == 0)
		{
			factors.push_back(i) ;
			if(n/i != i)
				factors.push_back(n/i) ;
		}
	}
}

vector< vector<long long> >dp ;

long long solve(int now , int idx)
{
	if(now == 0)
		return 1ll ;
	if(idx == factors.size())
		return 0ll ;
	long long &ret = dp[now][idx] ;
	if(ret != -1)
		return ret ;
	ret = 0 ;
	if(factors[now] % factors[idx] == 0)
		ret += solve(pos[factors[now] / factors[idx]] , idx) ;
	ret += solve(now , idx+1) ;
	return ret ;
}

int main()
{
	freopen("desc.in" , "r" , stdin) ;
	freopen("desc.out" , "w" , stdout) ;
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>k ;
	if(n == 1)
		return cout<<1<<"\n" , 0 ;
	factorize() ;
	sort(factors.begin() , factors.end()) ;
	for(int i = 0 ; i < factors.size() ; ++i)
		pos[factors[i]] = i ;
	dp = vector< vector<long long> >(factors.size()+2 , vector<long long>(factors.size()+1 , -1)) ;
	long long now = factors.size()-1 ;
	cout<<solve(now , 0)<<"\n" ;
	int last = 1 ;
	while(now > 0)
	{
		for(int i = last ; i < factors.size() ; ++i)
		{
			if(factors[now] % factors[i] != 0)
				continue ;
			long long x = solve(pos[factors[now] / factors[i]] , i) ;
			if(x >= k)
			{
				now = pos[factors[now] / factors[i]] ;
				cout<<factors[i]<<" " ;
				last = i ;
				break ;
			}
			k -= x ;
		}
	}
	cout<<"\n" ;
	return 0 ;
}