codeflash-internal/experiments/pie_test_set/p03286.py

193 lines
3.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

def problem_p03286(input_data):
# coding: utf-8
import bisect
import sys
"""Template"""
class IP:
"""
入力を取得するクラス
"""
def __init__(self):
self.input = sys.stdin.readline
def I(self):
"""
1文字の取得に使います
:return: 数
"""
return int(eval(input_data))
def IL(self):
"""
1行を空白で区切りリストにします(int
:return: リスト
"""
return list(map(int, self.input_data.split()))
def SL(self):
"""
1行の文字列を空白区切りでリストにします
:return: リスト
"""
return list(map(str, self.input_data.split()))
def ILS(self, n):
"""
1列丸々取得します(int
:param n: 行数
:return: リスト
"""
return [int(self.input_data) for _ in range(n)]
def SLS(self, n):
"""
1列丸々取得しますstr
:param n: 行数
:return: リスト
"""
return [self.input_data for _ in range(n)]
class Idea:
def __init__(self):
pass
def HF(self, p):
"""
Half enumeration
半分全列挙です
pの要素の和の組み合わせを作ります。
ソート、重複削除行います
:param p: list : 元となるリスト
:return: list : 組み合わせられた和のリスト
"""
return sorted(set(p[i] + p[j] for i in range(len(p)) for j in range(i, len(p))))
def Bfs2(self, a):
"""
bit_full_search2
bit全探索の改良版
全探索させたら2進数のリストと10進数のリストを返す
:return: listつ : 1個目 2進数(16桁) 2個目 10進数で合計
"""
# 参考
# https://blog.rossywhite.com/2018/08/06/bit-search/
# https://atcoder.jp/contests/abc105/submissions/4088632
value = []
for i in range(1 << len(a)):
output = []
for j in range(len(a)):
if ((i >> j) & 1) == 1:
"""右からj+1番目のiが1かどうか判定"""
# output.append(a[j])
output.append(a[j])
value.append([format(i, "b").zfill(16), sum(output)])
value.sort(key=lambda x: x[1])
bin = [value[k][0] for k in range(len(value))]
val = [value[k][1] for k in range(len(value))]
return bin, val
"""ここからメインコード"""
def main():
# 1文字に省略
r, e = range, enumerate
ip = IP()
id = Idea()
"""コピーコードです。https://atcoder.jp/contests/abc105/submissions/4088632
こちらを参考にテストを行っています。"""
n = ip.I()
# それぞれ半分全列挙
list1 = [(-2) ** i for i in r(16)]
list2 = [(-2) ** (i + 16) for i in r(16)]
list1_bin, list1_val = id.Bfs2(list1)
list2_bin, list2_val = id.Bfs2(list2)
# 2分探索
ans = 0
for i in r(len(list1_val)):
j = bisect.bisect_left(list2_val, n - list1_val[i])
if j < len(list2_val) and list1_val[i] + list2_val[j] == n:
ans = list2_bin[j] + list1_bin[i]
break
return int(ans)
main()