已知两个整数n和æ。你可以对整数x进行一些操作。您执行的每个操作都如下所示:选择在十进制表示中至少出现过一次的任何数字y,并用æ·y替换x。你想让æ(不带前导零)的十进制表示法的长度等于n。做到这一点所需的最小操作次数是多少?输入输入的唯一一行包含两个整数n和x (2<n <19;1 << 10-1)。输出打印一个整数——使x(不带前导零)的十进制表示长度l等于n所需的最小操作数,如果不可能,则为-1。
Examples
input
Copy
2 1
output
Copy
-1
input
Copy
3 2
output
Copy
4
input
Copy
13 42
output
Copy
12
题解:
很容易想到搜索来找答案,但是搜索中重复出现的值要返回
bfs比较好理解最先找到就是答案
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
using namespace std;
#define int long long
const int N = 4e6 + 10;
typedef pair<int, int> PII;
map<int,int> f;
int n,x;
struct node
{
int dep,now;
};
void solve()
{
cin >> n >> x;
queue<node> q;
q.push({0,x});
while(q.size())
{
node t = q.front();
q.pop();
if(f[t.now])
continue;
f[t.now] = 1;
string s = to_string(t.now);
if(s.size() == n)
{
cout << t.dep;
return ;
}
int vis[11] = {0};
for(int i = 0;i < s.size();i++)
{
vis[s[i] - '0'] = 1;
}
for(int i = 2;i <= 9;i++)
{
if(vis[i] == 0)
continue;
q.push({t.dep + 1,t.now*i});
}
}
cout << -1;
}
signed main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
int t = 1;
// cin >> t;
//scanf("%lld",&t);
while (t--)
{
solve();
}
}
//3 F
//5 B
//6 F
//9 F
//10 B
//12 F
//15 FB
//18 FB
dfs的话要全部搜完,得到一个最小值
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
using namespace std;
#define int long long
const int N = 4e6 + 10;
typedef pair<int, int> PII;
unsigned long long seed;
map<int,int> f;
int n,x;
int dfs(int t)
{
if(f[t])
return f[t];
string s = to_string(t);
if(s.size() == n)
return 0;
int vis[11] = {0};
for(int i = 0;i < s.size();i++)
{
vis[s[i] - '0'] = 1;
}
int res = 100;
for(int i = 2;i <= 9;i++)
{
if(vis[i])
res = min(res,dfs(i*t) + 1);
}
return f[t] = res;
}
void solve()
{
cin >> n >> x;
int ans = dfs(x);
if(ans == 100)
cout<<"-1\n";
else
cout << ans;
}
signed main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
int t = 1;
// cin >> t;
//scanf("%lld",&t);
while (t--)
{
solve();
}
}
//3 F
//5 B
//6 F
//9 F
//10 B
//12 F
//15 FB
//18 FB