POJ 1426 Find The Multiple
题目链接:POJ 1426 【Find The Multiple】
思路
输入数据,直到0时停止计算,并在循环输入内,每次计算前初始化所有需要用到的变量或者数组,避免影响计算结果。
从1开始依次枚举每一位是0还是1。同时使用取模的计算公式对数字进行优化防止数据溢出,(a + b) % mod = (a % mod + b % mod) % mod and ((a * b) % mod = (a % mod) * (b % mod)) % mod
。此时因为是DFS,所以需要注意搜索的最大长度在100,超过100位时就需要返回false,说明此时查找失败。对于每一组样例,还可以对相同余数的部分进行剪枝,即为出现余数mod时,将vis[mod] = true,此时后续再次计算出mod时,就可以知道前面计算出过,而且计算出的mod没得到正确解,所以直接continue,假如计算出的mod是以第一次计算出的mod为根节点的子树上,则说明当前的路线继续计算也会是一直循环计算出mod,所以也可以continue,直接进行下一个方案。
代码
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
#define ll long long
const int N = 1e5 + 10;
string s = "";
int n;
// 判断当前余数是否出现过
bool vis[N];
bool dfs(int mod, int deep) {
if (mod == 0) {
return true;
}
if (deep > 100) {
return false;
}
vis[mod] = true;
// 枚举当前位分别为0和1
for (int i = 0; i < 2; i++) {
int dmod = (mod * 10 + i) % n;
// 当前余数访问过时,跳过当前余数
if (vis[dmod] == true) {
continue;
} else {
if (dfs(dmod, deep + 1) == true) {
s = char('0' + i) + s;
return true;
}
}
}
return false;
}
int main() {
while (cin >> n) {
s = "";
memset(vis, 0, sizeof vis);
if (n == 0)
break;
dfs(1, 2);
s = '1' + s;
cout << s << endl;
}
return 0;
}