Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <bitset>
- #include <deque>
- #include <cmath>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- #include <list>
- #include <map>
- #include <queue>
- #include <set>
- #include <sstream>
- #include <stack>
- #include <string>
- #include <utility>
- #include <vector>
- #define fst first
- #define snd second
- #define all(x) (x).begin(), (x).end()
- #define clr(a, v) memset(a, v, sizeof(a))
- #define pb push_back
- #define mp make_pair
- #define sz(x) (int)(x.size())
- #define FORN(i,s,n) for(int i=s;i<(int)(n);i++)
- #define FOR(i,n) FORN(i,0,n)
- #define FORIT(i,x) for( typeof x.begin() i=x.begin(); i!=x.end(); i++ )
- #define trace(x) cerr << #x << ": " << x << endl;
- #define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl;
- using namespace std;
- typedef long long int64;
- typedef vector <int> vi;
- typedef pair <int,int> ii;
- typedef vector <string> vs;
- typedef vector <ii> vii;
- const int MAX = 100005;
- int64 X, a[MAX+2], b[MAX+2];
- vector <int64> d;
- vector < vector <int64> > dd;
- map <int64,int> pos, fst, snd;
- int seg[MAX], cnt, sz_a;
- void solve( int64 k ){
- if( k == 0 ){
- sz_a = 1; a[0] = X; return ;
- }
- else if( k % 2 ){
- solve(k-1); cnt = 0;
- FOR( i , sz_a ){
- int64 t = pos[ a[i] ];
- FOR( j , dd[t].size() ){
- b[cnt++] = dd[t][j];
- if( cnt >= MAX ) break;
- }
- if( cnt >= MAX ) break;
- }
- FOR( i , cnt ) a[i] = b[i];
- sz_a = cnt; return ;
- }
- solve( k/2 ); fst.clear(); snd.clear(); cnt = 0;
- FOR( i , sz_a ){
- if( !snd.count(a[i]) ) snd[ a[i] ] = i;
- }
- fst[1] = 0;
- FORN( i , 1 , d.size() ) fst[ d[i] ] = snd[ d[i-1] ] + 1;
- FOR( i , sz_a ){
- int t = pos[a[i]];
- FOR( j , dd[t].size() ){
- int64 cur = dd[t][j];
- FORN( l , fst[cur] , snd[cur]+1 ){
- b[cnt++] = a[l];
- if( cnt >= MAX ) break;
- }
- if( cnt >= MAX ) break;
- }
- if( cnt >= MAX ) break;
- }
- FOR( i , cnt ) a[i] = b[i]; sz_a = cnt;
- return ;
- }
- int main() {
- int64 k;
- cin >> X >> k;
- for( int64 i = 1 ; i*i <= X ; i++ ){
- if( i*i == X ) d.pb(i);
- else if( X % i == 0 ) d.pb( i ), d.pb( X/i );
- }
- sort( all ( d ) );
- vector <int64> aux;
- FOR( i , d.size() ){
- pos[ d[i] ] = i;
- aux.clear();
- FOR( j , d.size() ){
- if( d[i] % d[j] == 0 ) aux.pb( d[j] );
- }
- dd.pb( aux );
- }
- solve( k );
- sz_a = min( sz_a , 100000 );
- FOR( i , sz_a ){
- if( i ) printf(" ");
- cout << a[i];
- }
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment