D. Required Length
深搜就行了,每次乘上十进制表示里的所有数字(除了1)
但是这样会超时,所以要剪枝
从9~2遍历出现过的数字,如果有如下情况:
n - cnt + step >= minn
(距离目标十进制的长度+当前已走步数 >= 已知最小步数)
退出;
可以知道,这样减省了非常多的搜索过程
#include<bits/stdc++.h>
#define debug0(x) cout << endl << "debug0: " << x << endl
#define fr(t, i, n) for (int i = t; i < n; i++)
#define first fi
#define second se
using namespace std;
typedef long long LL;
int minn = 1e9;
void dfs(LL m,int step,int n){
bool k[10]={0,0,0,0,0,0,0,0,0,0};
LL cp = m;
int cnt = 0;
while(cp){
cnt++;
k[cp % 10] = true;
cp/=10;
}
//debug0(cnt);
if(cnt == n){
minn = min(minn,step);
return ;
}
else if(cnt > n) return ;
if(n - cnt + step >= minn)return;//非常巧妙的剪枝
for(LL i = 9;i >= 2;i --)if(k[i]){
dfs(m*i,step+1,n);
}
}
int main()
{
int n;LL m;cin >> n >> m;
dfs(m,0,n);
cout << (minn==1e9?-1:minn) << endl;
return 0;
}