#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
using namespace std;
#define maxn 3005
int getnum(int *x, int len, int poi){
int res = 0;
for (int i = len - 1; i >= 0; i--)
if (poi & (1 << i))
res = res * 10 + x[i];
return res;
}
bool head_zero(int *x, int len, int poi){
for (int i = len - 1; i >= 0; i--)
if (poi & (1 << i)){
if (x[i] == 0)
return true;
return false;
}
return true;
}
vector<int> vec[maxn];
int dp[maxn]; //表示val[num]后续最多还有多少个数字
int solve(int num){
if (dp[num] != -1)
return dp[num];
dp[num] = 0;
int len = vec[num].size();
for (int i = 0; i < len; i++)
dp[num] = max(dp[num], solve(vec[num][i]));
return ++dp[num];
}
vector<int> ans;
int val[maxn];
void dfs(int cur){
ans.push_back(val[cur]);
int len = vec[cur].size();
if (len == 0) return;
int minnum = INF, best = 0;
for (int i = 0; i < len; i++){
int v = vec[cur][i];
if (dp[cur] == dp[v] + 1 && val[v] < minnum){
minnum = val[v];
best = v;
}
}
dfs(best);
}
int main() {
map <int, int> mp;
int num;
while (cin >> num,num){
memset(dp, -1, sizeof dp);
ans.clear();
mp.clear();
for (int i = 0; i < 3000; i++)
vec[i].clear();
if (num < 10){
printf("%d\n", num);
continue;
}
int beginnum = num;
int x[10] = {};
int n = 0; //记录位数
while (num > 0){
x[n++] = num % 10;
num /= 10;
}
int cnt = 0;
for (int i = 1; i < (1 << n); i++){
int u = getnum(x, n, i); //取出x所有子序列
if (!mp[u]){
mp[u] = ++cnt; //离散化,标记数字
val[cnt] = u;
}
}
for (int i = 1; i < (1 << n); i++) {//遍历x所有的子集
if (head_zero(x, n, i))
continue;
int u = getnum(x, n, i); //取出该子集的数字
for (int j = (i - 1)&i; j; j = (j - 1)&i) {//遍历u的所有子集
if (head_zero(x, n, j))
continue;
int k = getnum(x, n, j); //从u中取走的数字
int v = getnum(x, n, i^j); //从u中取走数字后剩下的值
if (k <= 1 || u % k)
continue; //如果u不能整除k,即k不是u的约数
vec[mp[u]].push_back(mp[v]); //vec[i]表示:当前数字为i的时候,接下来一个取值(满足约数+子串)可以为vec[i][j]
}
}
for (int i = 1; i <= cnt; i++)
dp[i] = solve(i);
dfs(mp[beginnum]);
printf("%d", ans[0]);
int len = ans.size();
for (int i = 1; i < len; i++)
printf(" %d", ans[i]);
printf("\n");
}
return 0;
}
07-14
07-14
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交