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,直接进行下一个方案。
image


代码

#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;
}
posted @ 2024-07-09 15:03  薛定谔的AC  阅读(6)  评论(0编辑  收藏  举报