DFS分别枚举2-9的个数即可(如果有0最多乘一次,1无影响),注意控制2-9的总个数不超过18,当n到10时,先构造出来数,再判断该数的累乘次数是否大于当前最大值,将最大值存入ans,最后输出。

详见代码:

ll cnt[10]={0},mx=0,zs=0;
vector<ll>ans;
unordered_map<ll,ll>udp;
ll F(ll num)//单次累乘
{ 
    if(num==0)return 0;
    if(udp.count(num))return udp[num];
    ll s=num;
	ll a=1;
	while(s)
	{
		a*=s%10;
		s/=10;
	}
	udp[num]=a;
	return a;
}
ll g(ll x)//判断可以累乘几次
{
    ll ct=0;
    while(F(x)!=x)
    {
    x=F(x);
    ct++;
    }
    return ct;
}
ll bd()//构造函数
{
	ll aa=0;
	for(ll i=9;i>=1;i--)
		for(ll j=0;j<cnt[i];j++)
			aa=aa*10+i;
	return aa;		
}
void dfs(ll n)
{
	if(n==10)
	{
		ll num=bd(),ct=g(num);//构造数,用g函数得出当前数可以累乘几次
		if(ct>mx)//有更大的时替换mx和ans中的值
		{
			mx=ct;
			ans.clear();
			ans.push_back(num);
		}
		else if(ct==mx)//与当前mx等大时,存入ans
			ans.push_back(num);
        return;
	}
	for(ll i=0;i+zs<18;i++)//枚举2-9每个数的个数
	{
		cnt[n]=i;
		zs+=i;
		dfs(n+1);
		zs-=i;
	}
}
void solve()
{
	dfs(2);
	cout<<ans[0]<<" "<<ans[1];//输出其中两个
}