洛谷P1602_bfs+同余定理

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


猜你喜欢

转载自blog.csdn.net/jay__bryant/article/details/80245917