思路:
dfs。注意如果是1,直接返回,因为1的因子还是1。
因为x因子的因子还是x的因子,所以可以事先处理好x因子的因子在x因子中的位置。
不用这个方法也可以,用map映射vector保存因子的因子。
代码1:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem memset(a,b,sizeof(a)) const int N=1e6+5; vector<int>son[N]; vector<ll>t; ll x; int cnt=0; void dfs(ll k,ll n){ if(cnt==1e5)return ; if(n==0){ cout<<1<<' '; cnt++; return ; } if(k==0){ cout<<t[n]<<' '; cnt++; return ; }else{ for(int i=0;i<son[n].size();i++){ dfs(k-1,son[n][i]); if(cnt==1e5)return; } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); ll k; cin>>x>>k; for(ll i=1;i*i<=x;i++){ if(x%i==0){ if(i*i==x)t.pb(i); else t.pb(i),t.pb(x/i); } } sort(t.begin(),t.end()); for(int i=0;i<t.size();i++){ for(int j=0;j<=i;j++) if(t[i]%t[j]==0)son[i].pb(j); } dfs(k,t.size()-1); return 0; }
代码2:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem memset(a,b,sizeof(a)) vector<ll>t; unordered_map<ll,vector<ll>>vc; ll x; int cnt=0; void dfs(ll k,ll n){ if(cnt==1e5)return ; if(n==1){ cout<<1<<' '; cnt++; return ; } if(k==0){ cout<<n<<' '; cnt++; return ; } else{ if(n==x){ for(int i=0;i<t.size();i++){ dfs(k-1,t[i]); } }else{ if(vc.find(n)!=vc.end()){ for(auto x:vc[n]){ dfs(k-1,x); if(cnt==1e5)return ; } }else{ for(ll i=1;i*i<=n;i++){ if(n%i==0){ if(i*i==n)vc[n].pb(i); else vc[n].pb(i),vc[n].pb(n/i); } } sort(vc[n].begin(),vc[n].end()); for(auto x:vc[n]){ dfs(k-1,x); if(cnt==1e5)return ; } } } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); ll k; cin>>x>>k; for(ll i=1;i*i<=x;i++){ if(x%i==0){ if(i*i==x)t.pb(i); else t.pb(i),t.pb(x/i); } } sort(t.begin(),t.end()); if(k==0)cout<<x<<endl; else if(k>=1e5){ if(x==1)cout<<1<<endl; else{ for(int i=1;i<=1e5;i++)cout<<1<<' '; cout<<endl; } } else dfs(k,x); return 0; }