記録
6完, 122人中30位でした
超調子がいいので嬉しい!
B問題が難しいのに多くの人類通して怖かった.
A - 非力なレッド (★1.5)
No.2056 非力なレッド - yukicoder
提出 18:23 (0)
を無視して, 直接必要mpの最小値を求めることができる. これは貪欲的にやればよくて, 今
以上である
のの最右のindexを知ってそこまで操作することを繰り返せばよい.
左も巻き込む上に, 1回の操作で
は半分以下になるのだから, 操作回数(=mp消費量)は高々
である. これは30で,
だから間に合う. 計算量は
.
B - Ising Model (★2)
No.2057 Ising Model - yukicoder
提出 1:55:04 (1)
すべて
にすれば
となってどうみても最大値が達成できるからギャグかと思ったが, よく見ると求めるのは最小値だった.
すべて
にすれば
となる. これは
が強いときに良い感じだと思う. 奇数のとき
, 偶数のとき
が
が強いときに良い感じだと思った. この2つでminを取って出力したがWA.
実験してみると,
の係数は
ずつ変えられて,そのときの
の係数は
の係数が
変わるごとに
ずつ変えられる.
たとえば
で
のとき
となる.
import itertools
n = int(input())
a = []
for i in itertools.product([-1,1], repeat=n):
v = 0
w = 0
for j in range(n-1):
v += i[j] * i[j+1]
for j in range(n):
w += i[j]
a.append((v, w))
a.sort()
print(*a,sep="\n")
を固定して
の最大値を求めたとしても, 「良くない」
の場合がある. 奇数の
は良いが, 偶数の
は良くない. その一個上の
の
は良いやつで, こっちが最適になる可能性があるので, こっちにもminを取る. 結局コードは次のようになる.
n,a,b = map(int,input().split())
ans = a * (n-1) - b * n
if n % 2 == 0:
ans = min(ans, - a * (n-1))
ans = min(ans, - a * (n-3) - b * 2)
else:
ans = min(ans, - a * (n-1) - b)
print(ans)
C - Binary String (★2.5)
No.2058 Binary String - yukicoder
提出 14:38 (0)
貪欲的に1を詰めればよくて, 1に出会ったら打ち消し合う. だから, f(S)はこんな感じの図で説明できる.
小さい方からf(S)の値を実験してみる. (N=iの場合)+(i+1番目が1になる場合)=(Nがi+1の場合)となるから, 調べてみる.
N=4の場合は f(S)は小さい順から 1,3,3,1となる. この時点でもう
エスパーはできるが, i+1番目が1になる場合は 0,1,3,3,1 となる. これを足し合わせると1,4,6,4,1.
多分
帰納的に出来るんだと思う. N=iのときのf(S)を小さい順に並べたやつを
多項式g(i)だと思う. たとえば N=4のとき
.
帰納法で
を示そう.(ただし
)
で新しく増えるのは「(i-j)のときのやつ全部」+100001(操作回数j) である.
なので,
だけ増える.
で
帰納法よりok.
D - Odd Move Nim (★2.5)
No.2059 Odd Move Nim - yukicoder
提出 55:37 (0)
E - AND Sequence (★2.5)
No.2060 AND Sequence - yukicoder
提出 42:03 (0)
というのは, 高速ゼータ変換の記事とかで998244353回見たものである. これつまり
ということ.
この次には,
ARC116-C を思い出した. 倍数も包含も同じ順序関係なので同じ手法が使える. つまり,
を固定したときにどうなるかというアプローチが使える.
を
に固定したとき
だけ
がある.
のどこかで
を追加しないといけないから,
通りある. これが
個あるんだから,
となる.
つまり
を求めればいいことに気付く.
とデカすぎて, 愚直に求めるのは間に合わなそう.
で主客転倒を考える. つまり
で
となるものは何個あるかを数える. これは2進数の桁DPで出来る. 制約内のpopcountの上限は30だから間に合う. ぼくは
でやった.
で
となるものの個数を
としよう.
でOK! 気持ちよく解けた.
F - XOR Sort (★3)
No.2061 XOR Sort - yukicoder
提出 1:44:40 (1)
最初はxorの基底かと思った. WA.
よく見ると全然違う. 桁の上から決めていって順序がChangeするかどうかを調べればよい. Changeしたときにその状態を保持するべき.
管轄内を注目bitでソートするので, 部分的にsortできないかなと思ったけど,
pythonは弱い. 我々は
C++に引き寄せられる運命だったのかもしれない.(
C/C++は部分的にsortできる)
個人的にめちゃくちゃ好きな問題. 誰もfavしてなかったのでfavの第一人者になった. あとから別の2人がfavしにきた. 君たちも好きか.
G - Sum of Subset mod 999630629 (★3.5)
No.2062 Sum of Subset mod 999630629 - yukicoder
提出 コンテスト終了後
念のためNTT用に
の
素因数分解をしたけど, 面白そうではなかった.
modを外した問題だと普通に寄与を考えて
になる. 超簡単.
制約を見ると
は高々
にしかならない. じゃあ
はあまり襲ってこないということか. 和が
を超す部分集合の数を
とすれば,
が答えになる.
の数を求める方法はいくつか.
はだいたい37万だから, 現実的に求めやすそう.
最初は
かと思ったけど, 嘘だった. 本当は
なんだね. でも
だから愚直だとTLEる. どうすればよいのか.
に出現する
の種類は高々
だし, その種類が多すぎると和が簡単に
を下回ってしまう. だから種類ごとにまとめれば
FFTの回数が現実的な数字になって間に合いそう.
の係数は二項係数. これでやる人もいるかもしれない. でも,
多項式をlogで取ってから
掛けてexpを取って求めるやり方もある. ぼくはこれでやったけど, こっちの方が遅いと思う. あとは共通で,
FFTしまくる.
本質パートのサンプルが無いのがきつかった. デカイ場合に引っかかるのでそれはそうだけど
補足
最新ケースでTLEった. 二項係数で高速化したら7倍くらい速くなったけど最後のケースは落ちる.
FFTしまくってるのが原因と考えて,
のときだけ場合分けでsparseな
多項式として扱い,
として
で更新するようにしたら通った.
だけでなく, 全部sparseな
多項式として扱っても通った.(たぶん良い感じに抑えられる)
#793349 (C++17) No.2062 Sum of Subset mod 999630629 - yukicoder