求每位由0,1,2,...,K-1组成的能被M整除的最小的数
***********************************************************
由同余定理知,+和*运算,在中途取余对结果没有影响,
所以,边计算边取余,直到一个数能被M整除
因此,数的范围都是<M的,再用一个vector队列同步保存算得的值
***********************************************************
#include <cstdio> #include <queue> #include <vector> using namespace std; const int maxn = 1010; bool vis[maxn]; int K, M; void bfs() { queue <int> q1;//对M取模后的过程值 queue <vector<int> > q2;//维护q1的原本值 vector <int> t;//辅助容器 int i, j, u, v; for(i = 1; i < K; ++i) { if(i % M == 0) { printf("%d\n", i); return; } q1.push(i%M); vis[i%M] = 1; t.push_back(i); q2.push(t); t.pop_back(); } while(!q1.empty()) { u = q1.front(); q1.pop(); t = q2.front(); q2.pop(); for(i = 0; i < K; ++i) { v = (u*10+i) % M; t.push_back(i); if(!v) { for(j = 0; j < t.size(); ++j) printf("%d", t[j]); printf("\n"); return; } if(!vis[v]) { vis[v] = 1; q1.push(v); q2.push(t); } t.pop_back(); } } } int main() { scanf("%d %d", &K, &M); bfs(); return 0; }