Upgrade to Pro — share decks privately, control downloads, hide ads and more …

虫食い算を最適化で解決する

 虫食い算を最適化で解決する

Xでけんちょんさんのポストを見て気になっていたことが再燃した。
「一応、雑誌の懸賞問題なので、解けた方は「解けた」というリプのみでお願いします」とのことなので、コードはしばらく非公開で…
(そのうち公開するかも)

SperkerDeckの使用で点線ずれているけど許して...
&1月7日もっとシンプルな方法で実装可能なことに気が付いて追加

https://twitter.com/drken1215/status/1741489719241027864

Avatar for Monta Yashi

Monta Yashi

January 06, 2024
Tweet

More Decks by Monta Yashi

Other Decks in Programming

Transcript

  1. 作戦① 詳細 途中計算 X2 が6、X6 が8、C1 が2の場合(同時に成り立つ場合) 1) 縦の赤い部分  だけ着目  6×8+2

    ÷10 の余りは0(X10 は0)   → X(2,6) × X(6,8) × C(1,2) =X(10,0) 2) ヨコの緑の部分に  だけ着目  6×8+2の繰り上がりは5(C2は5)   → X(2,6) × X(6,8) × C(1,2) =C(2,5) X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 C1 C2 X14 被乗数、乗数、繰り上がりの全ての場合を事前計算する。 Ω0は取り得るのi,j,kに対して(i*j+k)/10 の余りが0となる 全ての組合わせ。 →約16,200通り(10*10*9*18)の組合 せを事前に計算する必要がある。 Ψ5は取り得るのi,j,kに対して i*j+kの繰り上がりが 5となる 全ての組合わせ。 →約12,600(10*10*9*14)の組合せを 事前に計算する必要がある
  2. 作戦① 詳細 合計 前の方法と同様に考えると、X11 、X14 、X18 、C16 の組合せにより、 X29 を決定できる。

    X29 :10*10*10*2 =2000通り X30 :10*10*10*10*3 =30000通り *機械的に実装した場合 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 C1 C2 被乗数、乗数、繰り上がりの全ての場合を事前計算する。 X14 X18 X29 C4 C16 X30 X31 X32 ざっくり合計10万くらいの制約が発生 *足し算をX 11 +X 14 =X α4 、X α4 +X 18 =X 29 と分解すれば制約条件数は減るが実装がめんどくさい
  3. 作戦② 方針 X1などに素直にInteger(0-9)を割り当てる。 良い:表現はシンプル 悪い:繰り上がりが表現できない    →表現方法を思いついた X1 X2 X3 X4

    X5 X6 X7 X8 X9 X10 X11 C1 C2 X11 X12 C3 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20
  4. 作戦② 詳細(掛算の制約) 繰り上がりの数C2は以下を満たす。    の部分で、X10 の計算方法を考えると、  X10 =X2 *X6 +C1 -C2

    *10 また、繰り上がりの数字が C2 で定義できるのであれば、 X2 *X6 +C1 はC2 ×10とC2 ×10+10の間の数字となる。  C2 *10 ≦ X2 *X6 +C1 ≦ (C2 +1)*10-δ *δは1より小さい数(0.1など)。線形計画Solverが<を使えないための工夫 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 C1 C2 X11 X12 C3 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20
  5. 作戦② 詳細(最上位) 最上位の桁の数字に関する制約 被乗数と途中計算の桁数が同じ場合、繰り上がりは0、最上 位の数  は0ではない。(1より大きな数)  X4 ≧ 1、 X8 ≧

    1 …  X4 × X8 +C3 ≦9 被乗数の桁数よりも大きい場合、最上位の数  は、繰り上が りの数と一致する。  X17 =C7 、 X22 =C11 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 C1 C2 X11 X12 C3 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20
  6. 作戦② 詳細(解算出の合計部分) 答えに関する制約 途中計算の掛算部分と同様に、繰り上がりと各桁の値の関係 を式にする。 途中計算の同じ桁の数字を合計し、繰り上がってきたかずを さらに加算する。(C15 は必ず0だが汎化して記載 )  X10

    +X13 +C15 C16 、X28 との関係は  C16 ×10 ≦ X10 +X13 +C15 ≦ (C16 +1)×10-δ  X28 =X10 +X13 +C15 - C16 ×10 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 C1 C2 X11 X12 C3 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20
  7. 作戦② 詳細(解算出の合計部分) 最大桁数に関する制約  0 ≦ X22 +X26 +C20 ≦ 9

    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 C1 C2 X11 X12 C3 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20
  8. 作戦③ 詳細(掛算の制約) 繰り上がりの数C2は以下を満たす。    の数は  1000*X12 + 100*X11 + 10*X10 +

    X9 これは被乗数と乗数の一桁目 X5 を掛けた数に等しい。 被乗数は  1000*X4 + 100*X3 + 10*X2 + X1 よって、制約は  (1000*X4 + 100*X3 + 10*X2 + X1 )* X5  == 1000*X12 + 100*X11 + 10*X10 + X9 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33
  9. 作戦③ 詳細(答えの制約) 最終行の答えの部分     の数は  1000000*X33 100000*X32 + 10000*X31    + 1000*X30 +

    100*X29 + 10*X28 + X27 … A1 これは被乗数と乗数 を掛けた数に等しい。 被乗数と乗数はそれぞれ  1000*X4 + 100*X3 + 10*X2 + X1 … A2  1000*X8 + 100*X7 + 10*X10 + X9 … A3 よって、制約は  A1 == A2*A3 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33
  10. 作戦③ 詳細 最大桁と固定数の制約 最大の桁は0ではない。    の数は  X4 >= 1  X8 >=

    1 : ヒントとして与えられている数    の制約  X12 == 2  X15 == 0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X28 X29 X30 X31 X32 X27 X33