求每位由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;
}