洛谷P1602_bfs+同餘定理

CoderCat.發表於2018-05-08

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