传送门:
题意:给你一个n和x,每次操作可以对x乘一个在x种出现过至少一次的数字,求最少的操作次数使得x到达n位。
分析:一开始想每次都乘x种最大的数字,但第三个样例不对。原因是你可以乘一个不是最大的数a,使得x*a可以更快的得到9。考虑bfs。因为每次乘的数字不超过10,故最终得到的数字/x必然是2357的组合,时间复杂度为O(log2(1e19)*log3(1e19)*log5(1e19)*log7(1e19))。算出来在1.5e6左右。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,x;
int vis[15];
map<int,int>mp;
struct node{
int x,cnt;
};
queue<node>q;
int len(int x)
{
int cnt=0;
while(x)
{
cnt++;
x/=10;
}
return cnt;
}
signed main()
{
cin>>n>>x;
q.push({x,0});
while(q.size())
{
node now=q.front();
q.pop();
int tmp=now.x;
if(mp[tmp]) continue;
mp[tmp]=1;
if(len(tmp)==n)
{
cout<<now.cnt<<endl;
exit(0);
}
for(int i=1;i<=9;i++) vis[i]=0;
while(tmp)
{
vis[tmp%10]=1;
tmp/=10;
}
for(int i=1;i<=9;i++)
{
if(vis[i]) q.push({now.x*i,now.cnt+1});
}
}
puts("-1");
}
v