web-dev-qa-db-ja.com

与えられた数の最小の倍数数字のみ0と1

整数Nが与えられます。数字の0と1のみで構成されるNの最小の倍数を見つける必要があります。この倍数は大きくなる可能性があるため、文字列の形式で返します。

返される文字列には、先行ゼロを含めることはできません。

例えば、

N = 55の場合、110は数字の0と1で構成される最小の倍数です。N= 2の場合、10が答えです。

関連するいくつかの問題を確認しましたが、コードで問題を見つけることができませんでした。これは、セットの代わりにマップを使用した後でも、いくつかのケースでTLEを与える私のコードです。

#define ll long long
int getMod(string s, int A)
{
    int res=0;
    for(int i=0;i<s.length();i++)
    {
        res=res*10+(s[i]-'0');
        res%=A;
    }
    return res;
}
string Solution::multiple(int A) {
    if(A<=1)
    return to_string(A);

    queue<string>q;
    q.Push("1");
    set<int>st;
    string s="1";

    while(!q.empty())
    {
        s=q.front();
        q.pop();
        int mod=getMod(s,A);
        if(mod==0)
        {
            return s;
        }
        else if(st.find(mod)==st.end())
        {
            st.insert(mod);
            q.Push(s+"0");
            q.Push(s+"1");
        }
    }

}
5
Saurabh Verma

Pythonに慣れている方のために、@ Damienのコードを変換したバージョンを示します。 Damienの重要な洞察は、各部分和が一度だけ調査される必要があるという事実を利用して、つまり最初に遭遇するという事実を利用して、検索ツリーを大幅に削減することです。

問題は Mathpuzzle でも説明されていますが、ほとんどの場合、必要なソリューションの存在を修正します。 整数シーケンスのオンライン百科事典 で言及されているコードもあります。 sage version は多少似ているようです。

私はいくつかの変更を加えました:

  • 空のリストから始めると、コードを簡略化しながら_A=1_を正しく解決できます。 10による乗算はループの終わりに移動されます。 log10(0)は_0_であるため、_minus infinity_に対して同じことを行うのは難しいようです。
  • _nodes[range]_と_nodes[new_range]_を交互に使用する代わりに、2つの異なるリストが使用されます。
  • Pythonは任意の精度の整数をサポートするため、部分的な結果は文字列ではなく10進数または2進数として保存できます。これは以下のコードではまだ行われていません。
_from collections import namedtuple

node = namedtuple('node', 'sum str')

def find_multiple_ones_zeros(A):
    nodes = [node(0, "")]
    used = set()
    pow_ten = 1
    while True:
        new_nodes = []
        for x in nodes:
            y = node(x.sum, "0" + x.str)
            new_nodes.append(y)
            next_sum = (x.sum + pow_ten) % A
            y = node((x.sum + pow_ten) % A, x.str)
            if next_sum in used:
                continue
            used.add(next_sum)
            y = node(next_sum, "1" + x.str)
            if next_sum == 0:
                return y.str
            new_nodes.append(y)
        pow_ten = (pow_ten * 10) % A
        nodes = new_nodes
_
0
JohanC