Sramoc(k,m)表示用数字0到k-1组成的自然数中能被m整除的最小数,求这个数。
思路:
整除满足分配律:a+b%m=(a%m+b%m)%m a*b%m=(a%m*b%m)%m;
所以对于两个余数一样的数字,之后的所有情况都是一样的,我们只需要考虑余数不一样的数字,也就是说我们最多只需要考虑m个数就行了
#include <bits/stdc++.h>
using namespace std;
int k, m;
int vis[10010];
struct ty {
string s;
int yu;
};
void bfs(string s) {
queue<ty> q;
q.push({"1", 1});
vis[1] = 1;
while (!q.empty()) {
ty tmp = q.front();
q.pop();
if (tmp.yu == 0) {cout<<tmp.s;return ;}
for (int i = 0; i < k; i++) {
if (!vis[(tmp.yu * 10 + i) % m]) {
ty cur = tmp;
cur.s += i + '0';
cur.yu = (tmp.yu * 10 + i) % m;
q.push(cur);
vis[cur.yu]=1;
}
}
}
}
int main() {
scanf("%d%d", &k, &m);
bfs("1");
return 0;
}

京公网安备 11010502036488号