[AT3621][ARC084B] Small Multiple
AgrumeStly · · 题解
solution
我们先考虑暴力,把
这肯定超时,关键是循环取每位爆炸,那么我们不妨想,一个数的各个位数和是如何求出的。
先看个位,
再看其他位,无非就是
综上,我们可以整理出两种状态:
但是我们发现还有一个问题,那就是这种方法是会超
当然不,我们发现我们欲求
讲完基本思路,讲一下如何实现。
我们知道 bfs 一般会用队列,那么在 01 bfs 中,我们会用到双向队列
#include <queue>
与 #include <deque>
均包含
Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <deque>
using namespace std;
const int NR = 1e6 + 5;
int k;
int ans;
bool vis[NR];
struct node {
int num, w;
};
deque<node> d;
void bfs() {
d.push_front(node{1, 1});
vis[1] = true;
while (!d.empty()) {
int num = d.front().num, w = d.front().w;
d.pop_front();
if (num == 0) {
cout << w << endl;
return;
}
if (!vis[10 * num % k]) {
d.push_front(node{10 * num % k, w});
vis[10 * num % k] = true;
}
if (!vis[num + 1]) {
d.push_back(node{num + 1, w + 1});
}
}
return;
}
int main() {
cin >> k;
bfs();
return 0;
}