DFS之剪枝2

文章讨论了将给定整数x通过特定操作变成n位数的最优化策略,涉及动态规划和字符串操作。
摘要由CSDN通过智能技术生成

给定两个整数 n , x n,x n,x

你可以对 x x x 进行任意次以下操作:

  • 选择 x x x 的一位数字 y y y,将 x x x 替换为 x × y x \times y x×y

请你计算通过使用上述操作,将 x x x 变为一个 n n n 位数字(不含前导 0 0 0),所需要的最少操作次数。

例如,当 n = 3 , x = 2 n=3,x=2 n=3,x=2 时,对 2 2 2 进行如下 4 4 4 次操作,即可使其变为 3 3 3 位数字:

  1. 2 2 2 替换为 2 × 2 = 4 2 \times 2 = 4 2×2=4
  2. 4 4 4 替换为 4 × 4 = 16 4 \times 4 = 16 4×4=16
  3. 16 16 16 替换为 16 × 6 = 96 16 \times 6 = 96 16×6=96
  4. 96 96 96 替换为 96 × 9 = 864 96 \times 9 = 864 96×9=864
输入格式

共一行,包含两个整数 n , x n,x n,x

输出格式

一个整数,表示将 x x x 变为一个 n n n 位数字,所需要的最少操作次数。

如果无解,则输出 -1

数据范围

所有测试点满足 2 ≤ n ≤ 19 2 \le n \le 19 2n19 1 ≤ x < 1 0 n − 1 1 \le x < 10^{n-1} 1x<10n1

输入样例1:
2 1
输出样例1:
-1
输入样例2:
3 2
输出样例2:
4
输入样例3:
13 42
输出样例3:
12
N,x = map(int,input().split())

ans = float('inf')
cnt = 0
def qmi(a,b):
    ans = 1;
    while b!=0:
        if b&1 == 1:ans*=a
        a*=a
        b>>=1
    return ans

def DFS(n,cnt):
    global N,ans
    if len(str(n)) == N:ans = min(ans , cnt)
    if cnt >= ans or len(str(n)) > N:return 
    if cnt+(N - len(str(n))) >=ans:return#用10的好处,可以直接加,用9还要qmi()
    #因为最多每一次就乘以9,干脆算作乘以10 ,那么至少cnt+(N - len(str(n)))次才能到n位数
    a = set()#去重
    for i in str(n):
        a.add(ord(i) - ord('0'))
    for A in a:
        #print(n)
        if A >= 2:
            DFS(n*A,cnt+1)
DFS(x,0)
if ans !=float('inf'):print(ans)
else: print(-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值