数字存在性问题研究
[ABC077D] Small Multiple
传送门
Problem
给定一个整数
Solution
很容易发现答案必然小于或等于
如果题目是这样的:
统计
[L, R] 中满足数位和等于s 且x \equiv k \pmod{m} 的整数x 的个数。
熟悉吗?这就是很朴素的数位 DP。
有什么不同呢?
- 本题不关心范围
- 本题不关心个数
也就是说我们只关心能不能成功构造出一个数字,此时 pos 是无意义的,因为位置是无限的。所以我们只要记录当前的 state ——也就是数位和 sum 和余数 remainder,暴力加数转移即可。
使用 bfs 保证找到的一定是最小的数(没啥用就是了)。
#include <bits/stdc++.h>
using namespace std;
int k;
bool vis[100005][60];
void bfs() {
queue<pair<int, int> > q;
for(int i = 1; i <= 9; i++) {
int remainder = i % k;
int sum = i;
if(!vis[remainder][sum]) {
vis[remainder][sum] = true;
q.push({remainder, sum});
}
}
while(!q.empty()) {
auto [remainder, sum] = q.front();
q.pop();
for(int i = 0; i <= 9; i++) {
int new_remainder = (remainder * 10 + i) % k;
int new_sum = sum + i;
if(new_sum <= 55 && !vis[new_remainder][new_sum]) {
vis[new_remainder][new_sum] = true;
q.push({new_remainder, new_sum});
}
}
}
}
int main() {
cin >> k;
bfs();
for(int i = 1; i <= 55; i++) {
if(vis[0][i]) {
cout << i;
break;
}
}
return 0;
}
[ABC423G] Small Multiple 2
传送门
Problem
求满足以下两个条件的正整数
Solution
答案必然为
由基本不等式得
这里有个细节,
枚举
显然
枚举
这里要用扩展欧几里得算法求最小非负解
最后找最小的答案即可。