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];//输出其中两个
}

京公网安备 11010502036488号