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; }