整数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");
}
}
}
Pythonに慣れている方のために、@ Damienのコードを変換したバージョンを示します。 Damienの重要な洞察は、各部分和が一度だけ調査される必要があるという事実を利用して、つまり最初に遭遇するという事実を利用して、検索ツリーを大幅に削減することです。
問題は Mathpuzzle でも説明されていますが、ほとんどの場合、必要なソリューションの存在を修正します。 整数シーケンスのオンライン百科事典 で言及されているコードもあります。 sage version は多少似ているようです。
私はいくつかの変更を加えました:
A=1
_を正しく解決できます。 10による乗算はループの終わりに移動されます。 log10(0)
は_0
_であるため、_minus infinity
_に対して同じことを行うのは難しいようです。nodes[range]
_と_nodes[new_range]
_を交互に使用する代わりに、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
_