POJ 1426(模運算+bfs)
阿新 • • 發佈:2018-12-09
題意
給一個數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;
}