E-POJ 1426

#include <iostream>
#include <cstring>
#include <stack>
using namespace::std;

// 從0位向最高位dfs搜索,每位要麼取0,要麼取1
// 並且保存搜索到當前節點算出的餘數ans,基數base
// 如果該位爲1,那麼ans=ans+base; 如果該位爲0,那麼ans=ans不變
int n; // 1 <= n <= 200
bool m[101]; // 用來表示大數m
bool bOne; // 排除全0的情況
bool solve(int pos, int base, int ans) {
    if (pos >= 100) {
        return ans == 0 && bOne;
    }
    if (solve(pos + 1, (base * 10) % n, ans)) return true;
    m[pos] = 1; bOne = true;
    if (solve(pos + 1, (base * 10) % n, (ans + base) % n)) return true;
    m[pos] = 0;
    return false;
}

int main(void) {
    while ((cin >> n) && n != 0) {
        memset(m, 0, sizeof(bool) * 101);
        bOne = false;
        solve(0, 1, 0);
        int i = 100;
        while (m[i] == 0) --i;
        while (i >= 0) cout << m[i--];
        cout << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章