1. 程式人生 > >POJ 1426(模運算+bfs)

POJ 1426(模運算+bfs)

題意

給一個數n(n<=200),找到一個n的倍數x,x的十進位制表示形式中只有1和0

分析

如果這個倍數很小的話我們可以直接bfs每一位,然後找到能整除的即可,但顯然最後的數肯定超過了範圍。我們還能發現由n個1組成的數一定是滿足題意的,但是題目又要求結果的長度不能超過100。

換個思路想想,整除,就是餘數為0,按照最開始的bfs的思路的話,我們是存了整個數,然後將整個數去模n看餘數是否為0,但其實整個工作可以交給餘數完成,對於一個數a,如果他不能被n整除,那我們就儲存餘數,然後搜下一位的話,不是將整個數擴大10倍,而是將餘數擴大10倍,再加1或者0,這個操作是等同與將整個數擴大10倍的,反正最後都要模n。

程式碼

#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
struct node
{
    string a;
    int yu;
    node() {}
    node(string aa, int yy)
    {
        a = aa;
        yu = yy;
    }
};
int vis[205];
int main()
{
    int n;
    while
(cin >> n && n) { memset(vis, 0, sizeof(vis)); queue<node> que; que.push(node("1", 1 % n)); string ans; while (que.size()) { node now = que.front(); que.pop(); if (now.yu == 0) { ans = now.a; break
; } if (!vis[(now.yu * 10 + 1)%n]) { vis[(now.yu * 10 + 1) % n ] = 1; que.push(node(now.a + "1", (now.yu * 10 + 1) % n)); } if (!vis[now.yu * 10%n]) { vis[(now.yu * 10) % n] = 1; que.push(node(now.a + "0", (now.yu * 10) % n)); } } cout << ans << endl; } return 0; }