小红希望最终
两个正整数和
,用空格隔开。
如果无法如何都无法使得是
的倍数或者
是
的倍数,则输出-1。
否则输出一个整数,代表小红的最小操作次数。
37 111
0
111是37的倍数,所以小红不需要任何操作。
1234 99
2
第一个数删除数字'1',变成234。第二个数删除数字'9',变成9。234是9的倍数。
这道题其实简单喵~
只需要用广度优先搜索(BFS)就可以探索所有可能的状态了喵!
有思路了就去写喵!
如果只是不会写就看猫猫的代码喵~
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
// 喵~每个组都要记住:当前步数、a的值、b的值
struct zu
{
ll cishu; // 已经操作的次数
ll a, b; // 两个数当前的值
};
int main() {
ll a, b;
cin >> a >> b;
queue<zu> q; // BFS队列
q.push({0, a, b}); // 初始状态入队,步数为0
set<pair<int,int>> s; // 记录已经访问过的 (a, b) 状态,防止重复探索
while (!q.empty())
{
zu now = q.front(); // 取出来最小步数的一组
q.pop();
// 检查当前两个数是否满足倍数关系(一个能整除另一个)
if (now.a % now.b == 0 || now.b % now.a == 0)
{
cout << now.cishu; // 输出当前步数
return 0; // 任务完成,喵~
}
// 尝试删除 now.a 的每一位
for (int i = 1; i <= now.a; i *= 10)
{
// 删除第 i 位后的新数:高位部分 * i + 低位部分
int new_a = now.a / (i * 10) * i + now.a % i;
if (new_a == 0) continue; // 题目不让全删完喵~
// 如果这个新状态没访问过,就入队
if (!s.count({new_a, now.b}))
{
s.insert({new_a, now.b});
q.push({now.cishu + 1, new_a, now.b});
}
}
// 同样,尝试删除 now.b 的每一位
for (int i = 1; i <= now.b; i *= 10)
{
int new_b = now.b / (i * 10) * i + now.b % i;
if (new_b == 0) continue;
if (!s.count({now.a, new_b}))
{
s.insert({now.a, new_b});
q.push({now.cishu + 1, now.a, new_b});
}
}
}
// 如果队列空了还没找到解,就输出-1
cout << -1;
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⡀⣀⣠⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⢀⣴⣾⣷⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⠛⠉⠉⠉⠉⠉⠉⠛⠻⠿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⡿⠿⠛⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣀⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⣰⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣶⣄⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣻⣿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢹⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⠁⠈⢢⡀⠀⠀⠀⢸⡇⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⡟⠒⢦⡀⠀⠀⠀
⠀⠀⣠⣤⣤⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡇⠀⠀⠀⠉⢢⣄⠀⠀⢿⠊⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⡄⠀⢷⠀⠀⠀
⠀⢰⠇⠀⣰⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⡌⣹⠗⠦⣬⣇⠀⠉⢢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀⢸⡄⠀⠀
⠀⡟⠀⣼⣯⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣆⢹⡀⠀⠀⠀⠉⠁⠀⠀⢀⣀⡁⠀⠀⠉⠳⢴⡆⠀⠀⠀⠀⠀⠀⢹⣧⠈⡇⠀⠀
⠀⡇⠀⠀⢻⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⠻⠉⠛⠂⠀⠀⠀⠀⠀⠀⠻⠿⣿⣿⣿⣶⣦⡀⠛⣇⠀⠀⠀⠀⠀⣈⣿⠀⡇⠀⠀
⢸⡇⠀⠀⢠⣿⣷⣦⣀⡸⣷⣦⣶⡂⠉⠉⠉⢁⣤⣶⡶⠀⠀⠀⣀⣀⡴⠀⠀⠀⠀⠀⠀⠈⠉⠉⠁⠀⡟⢀⣴⣟⣰⣾⣿⣏⣠⠇⠀⠀
⠈⡇⠀⠀⢸⣿⠁⠉⣿⠛⠛⠃⡇⠀⠀⢠⣶⣿⡿⠛⠁⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠼⢿⠟⠿⢿⡏⠀⠘⣿⡀⠀⠀⠀
⠀⢷⣀⣀⣿⠇⠀⠀⢿⡇⠀⢀⢱⡀⠀⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠀⠀⢸⠇⠀⠀⢹⣿⣄⠀⠀
⠀⠀⣉⣿⡏⠀⠀⠀⠀⠀⠀⢸⣇⣳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⣿⠃⠀⠀⠀⠀⠀⠀⣿⠈⢧⠀
⠀⠘⣿⣿⠁⠀⠀⠀⠀⠀⠀⠘⣿⡛⣶⠀⠀⣠⠔⠒⠛⠒⠦⡀⠀⠀⠀⠀⣠⡤⠶⠤⢤⣀⠀⠀⠀⢀⣏⡄⠀⠀⠀⠀⠀⡀⣿⡆⠈⣧
⣠⡾⠛⣿⣿⣧⠀⠀⠀⠀⢸⣿⠾⢿⡿⠀⣰⠃⠀⠀⠀⠀⠀⢹⡄⠀⠀⡼⠁⠀⠀⠀⠀⠈⠙⣦⠀⢸⣿⡇⣾⣣⡀⠀⢰⣿⣿⣿⣤⠾
⡟⠀⠀⠻⣿⡟⢷⡄⣤⡀⠈⣿⡀⣸⠇⠀⠏⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⡇⢀⡀⠀⠀⠀⠀⢀⡟⠀⠀⠋⣿⣿⣿⡇⣠⣿⠿⠛⢷⡀⠀
⠀⠀⠀⠀⣿⣇⣨⣿⣿⣿⣦⣽⣷⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠃⠀⠙⠢⠤⠤⠴⢾⠀⠀⠀⠀⢸⣷⣿⣿⠟⠁⠀⠀⠈⣧⠀
⠀⠀⠀⠀⠈⠉⠉⠁⠈⠉⠈⢉⣿⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⣿⠀
*/ from functools import cache a, b = input().split() n1, n2 = len(a), len(b) def subset(n, m): x = (1 << m) - 1 mx = x << (n - m) while x <= mx: yield x y = x & -x c = x + y x = (((x ^ c) >> 2) // y) | c return @cache def f(s, m): n = len(s) arr = list(map(int, s)) def to_int(x): acc = 0 for i in range(n): if x & 1: acc *= 10 acc += arr[i] x >>= 1 return acc return set(map(to_int, subset(n, m))) def solve(): for i in range(n1 + n2 - 1): for j in range(max(0, i - n2 + 1), min(i + 1, n1)): k = i - j for x in f(a, n1 - j): for y in f(b, n2 - k): if x % y == 0&nbs***bsp;y % x == 0: return i # return n1 + n2 # 我寻思 0 是 0 的倍数,那全删完一定可以啊 # 仔细一想,全删完会得到一个空串,不能解读为数字 return -1 print(solve())