2018年10月5日 思考ログ

2018年10月5日2018年10月5日
1ぽ = 25分 です。
予定:1ぽ

 

ネットワークセキュリティ略号
NIC(Network Interface Card)コンピュータをネットワーうに接続するための拡張カードCRC(Cyclic Reduncy Check) ビット列を特定の式で割り、そのあまりをチェック用データとして孵化する。TCP/IP
TCP or UDP(ネットワーク層:送信データの信頼性をどのように保持するか)TCPの方が信頼性重視(コネクション型:受け取り確認を行う。)IP(ネットーワーク層:ネットワークをいかにしてつなぎ、経路制御を行うか)コネクションレス
サブネットマスク:デカイネットワークをちゅうくらいのに分ける。
ARP  IPアドレス  → MACアドレスRARP MACアドレス → IPアドレスDHCP IPアドレスを自動的に行う
グローバルIPアドレスとプライベートIPアドレスがあるよ。NAT;グローバルIPとプライベートIPを1:1に結びつける。IPマスカレード:グローバル1に対しIPアドレスが多。
DNS(Domain Name System):(ドメイン名とIPをアドレスを関連づけている。)ICMP (internet control massege protocol)tcp/ip のエラー報告用アドレス。SNMP(Simple Network Management Protocol)ネットワークを構成するルータやスイッチなど、様々な機器の状態や設定を管理するために用いられるプロトコル
代表的なネットワークとそのプロトコル
HTTP webページ転送のためのプロトコル ポート番号:80FTP  ファイル転送サービスに利用するプロトコル ポート番号:(制御用20:転送用21)Teinet 他のコンピュータにログインして遠隔操作を行う際に使うプロトコル。(23)SMTP 電子メールの配送部分を炭労するプロトコル。POP 電子メールの受信部分を担当するプロトコル (110)ステートレスNTP ネットワークの時刻合わせをするプロトコル 123
IMAP POPと同様に電子メールを受信するためのプロトコル ステートフルMIME ASC II を 拡張する。
セキュリティ辞書攻撃 辞書に載ってそうな単語を片っ端から試す。ブルートフォース 全探索スニッフィング パケットを盗聴してパスワードを不正に取得しようとする手法。ゼロデイ攻撃  泣きっ面に蜂。脆弱性発覚後、パッチ修正が入る前に追加攻撃。クロスサイトスクリプティング  悪意のあるスクリプトを入力フォームから埋め込みあれする。フィッシング  偽物サイトに誘導する。DNSキャッシュボイズニング  一次的に偽のドメイン情報を覚えさせて偽装webサイトへ誘導する。DNSサーバが問い合わせに対する応答を電署名で検証できるようにする。ディレクトリトラバーサル攻撃  想定外の相対パスを入れて公開対象でないファイルディレクトリの情報をニュー雨しゅする。ペネとレーションテスト 既知の手法を試す。
データベース

トランザクション管理 排他制御トランザクションのACID
コミットとロールバックコミット:データベースに変更内容を更新させること。ロールバック:更新前の状態に戻すこと。ロールフォワード:バックアップの状態にDBを戻して、もう一回トランザクションを行う。
ネットワークとセキュリティは1.5ぽかかった。データベースは0.5ぽだった。

 

webアプリ作成 

ディレクトリわからなくなって絶望する。letterです。

Virtual Box 消えてて絶望する。

http://elm-arata.hatenablog.com/entry/2013/09/25/175547http://tic40.hatenablog.com/entry/2017/09/20/080000

なんかの拍子に紐付けが外れることがあるらしい。ちゃんと消そう。
progate:section10までやった。コンソールか入力するデータと元のデータベース別...?
 

2018/10/03 思考ログ

2018年10月3日2018年10月3日


予定就活 2ポ英語 1ポAP 2ポ
現実就活 2ポ英語 2ポ


英語

疑問文が聴き取れないんです。Would eaither of those days be OK ? 
What 難しい英語は1個1個の事柄は難しくないけど、脳死で処理できるようにならないといけない。What interested me more than anything else then was the writeing of short story.文の前半について。The thing interested me.とAynthing else interested meのThe thing とaynything を比較すると、The things interested me more than anything else interested meになり、いらない語を省略すると、The thing interested me more than anything else になる。what を用いて名詞節に変換し、was ... をつけるとWhat interested me more than anything else was thw writeing  of short story.
History must be the story of how things have come to be what they are.


AP

文字列の一意的に復号可能。ダブらないように気をつける。誤読読み落とし注意。

CPUスタックポイント サブルーチン呼び出しの時に、戻り先アドレスおよびレジスタの内容を格納するメモリのアドレス。

スタック CPUに対する割り込み要求が発生した場合、割り込みが発生する直前まで実行していたプログラムのフラグやプログラムレジスタの値を一次的に退避する場所として使われる。SIMD(Single Instruction Multipke Datestream)USBUSB3.0 4つの転送スピードを持つシリアルインターフェイス

クライアントサーバシステムの③層アーキテクチャプレゼンテーション層、ファンクション層、データ層でできている。OSは異なっても良いよ。ビジネスロジックに変更があった時に変更が効きやすい。(よくわからない)

ライブマイグレーション (生きたまま移住させる)停止せずに他の物理サーバに移し替える技術である。

透過性 ブラックボックス的な性質。

フェールセーフ 異常が発生した時に2次災害を起こさないようにする。

フェールソフト 障害が発生した時に全面停止しないようにする。

DRAM 安い方SRAM 高い方

SoC(system on chips)

トランザクションちゃんと理解しましょう。

システム監査人は担当者のリスク認識について、アンケート調査をします。財務状態の予測と情報化投資計画は整合性を保ちましょう。予算がたくさんかかるので。

明日への申し送り。DBの漫画の本の問題解き直してください。ネットワーク周りの計算問題解いてください。覚える必要があるプロトコルの名前を列挙してください。


アプリ作り

2ポ原因研究データの参照先を調べるよくわかんなくなったのでぶっ壊して作り直しました。

2018/10/03コントローラー:postsアクション:enevelopesテーブル:Postカラム:contentrails:https://progate.com/rails5/study/2/1わけわからんくなったからぶっ壊した。投稿用データベースと表示用データベースが異なっていた、もしくは連動していなかったことが原因と思われる。
作り直し。変数名もprogateに通りに作りなおす。section 2まで終わり。cssも作ろうかなと思ったけど画像ファイルとか入ってないからやめた。

 

2018年10月2日 思考ログ

2018年10月2日

英語
fall が聞きにくい。フォールよりボースに聴こえる。
be almost spring もうすぐ春。
疑問文が聴き取れない。Do you have any advice ?
構造が複雑になると聴き取れない。
I was thinking that if we grew different vegetables we could share them later this fall.
different なにが違うの?って思った。娘のパパでちがう野菜を作ればシェアできるよって話。
what が作る名詞節
①文全体での名詞節の働き
②名詞節の中での疑問詞や関係詞の働き
③疑問詞や関係詞の意味
の3つのことを考える必要がある。
What I saw and heard and learned in my boyhood days made lasting impressoion on me.

AP
サブミッションポート
電子メールの送信には
一般的にはSMTP(ポート番号25を用いる)
最近、サブミッションポート(ポート番号587を用いる)
イベントドリブン
クリックでの画面遷移をおう
ステークホルダ 利害関係者
プロジェクトマネジメントオフィス {プロジェクトスポンサ、プロジェクトスポンサ}
情報化投資計画と財務状態の予算の整合性。情報システムの開発。

ファイル整理
終了写メ撮りました。画像参照のコメントが欲しい。
データ入力画面を作りましょう。
作戦変更。progateでデータベースを先に作ってたからそちらを先にやりましょう。
どこまでいけるかは不明。rails Level2 step9 まで行った。
え、わかんない。
やりたいこと。envelope(手紙を保存しているファイル)にconsoleからデータを保存できるようにしたい。
3ポめ。現状把握しよう。
昨日までやっていたこと。
マイグレーションファイルを作成するために、
rails generate controller posts enevelope
を実行した。postsというコントローラー、enevelopesというアクションを作る。
コントローラーをクラスとした時、アクションはメソッド。

今日やったこと。
postsテーブルを作成するため、以下2つの手順を実行したい。
①データベースを変更する指示するファイルを作成したい。
rails generate model Post content:text
を実行した。
②データベースに変更を反映したい。
rails db:migrate

terminalまわりの奴がよくわからない。保存されてないの?どこに設定されてるの?

 

その他

匿名性の高いSNS

2018年10月1日 思考ログ

2018年10月1日(月)

 


APデータベースやらないといけない。トランザクション、何回やってもよくわからない。参照制約ってなに?マセマにも乗ってないんですが。1バイトは8ビット。通信経路はボトルネックとなるものが答えとなる。第7層 アプリケーション層 ゲートウェイ第6層 プレゼンテーション層 ゲートウェイ第5層 セッション層 ゲートウェイ第4層 トランスポート層 ゲートウェイ第3層 ネットワーク層 ルータ第2層 データリンク層 ブリッジ第1層 物理層 リピータ
ゲートウェイ プロトコル変換を行うルータ ネットワーク間を中継(IPアドレスを使う)ブリッジ ネッtーワーク内を中継する(MACアドレスを使う)NIC,リピータ、NIC 電気的な信号を使ったり受けたりする
IPアドレス  → MACアドレス ARPMAXアドレス → IPアドレス  RARP
ルータの冗長化 VRRPルータの冗長化ってなに?冗長化 システム障害に備えてバックアップを備えておくこと仮装MACアドレスを作って障害に備えるもの?
サブネットマスク A,B,Cがあるやるつ。2進数変換してビット数揃える。何に使うものだ?よくわからん次。
DNSキャッシュボイズニングDNSサーバに偽のIPアドレスの変換情報の流し込み有害サイトへの誘導やメールの盗聴などを行う。

ABC057 D Maximum Average Sets 

ABC057 D Maximum Average Sets 

D - Maximum Average Sets

 問題概要

N個の品物からA個以上B個以下選び平均の最大値とその選び方が何通りあるか答えなさい。

1≦N≦50

1≦A≦B≦N

1≦v_i≦10^{50}

v_iは全て整数

考察

k個目までの平均をA(k)とします。v_{k+1}A(k)の大小関係によってA(k+1)A(k)と大小関係が決まります。v_{k+1}≧A(k)であれば、A(k+1)≧A(k)のような具合です。

だから、問題の条件下における平均の最大値はv_iの大きい方からA個選んだものということになります。また、平均がこの値を保ったままA個以上の数字を選べるのは、平均値がA番目に大きいv_iと等しいときのみで、選べる数値はこの数のみです。この値をv_Aとしたとき以下の2つの場合分けで答えを求めることが出来ます。

ⅰ.v_iの最大値がv_Aだったとき

つまり、v_iv_AがA個以上ありかつ、それが最大値だったときです。このときv_AをA個から、B個もしくはv_Aの個数まで、取れる通り数の和が答えになります。

ⅱ.上記以外

このときA個以上の値を選ぶことが出来ません。だから、大きい方からA個までにv_Aを何通りの方法でこれを入れれるかが答えになります。よって、v_Aが大きい方からA個に何個あるか数列全体で何個あるかにで答えが決まります。

提出コード

解説コードまんまです...参考になる部分が多かったから丸覚えしたくなったんだもん...

gist.github.com

AtCoder C問題(051,065,066,067,078)

C問題5問解いたのでまとめです。

 

C - Back and Forth

問題概要

イルカが(sx,sy)(tx,ty)を2往復する。最短の経路を求めよ。ただし、同じ座標は通ってはいけない。

考察

なにはともあれお絵描きします。

f:id:guitarjoepass:20180628154956p:plain

黄色は、左下に(sx,sy)右上に(tx,ty)があり、縦の長さ(ty-sy)横の長さ(sx-sy)の長方形で、青色はその長方形の上下左右1ずづ広げたものです。黄色内(辺を含む)を通れば、目的地の逆の方向に進まない限り(例えばSからTに行きたいのに左に行くなど)最短経路になります。ただし、同じ座標を2度通らない経路は往復1回分しかありません。従って2回目は青色の長方形の範囲を通ることになります。

解答例

gist.github.com

(絵に書いたようなクソコード)

もう少し考察

 上の考察が雑すぎたので、もう少しちゃんと考えていこうと思います。問題解いたときは上の考察だったので残しておきます。

問題のイメージを変えます。点Sと点Tが伸び縮みができる4本の紐で繋がってるものとして考えます。点Sと点Tの置く場所は決まっています。紐同士を交差させずに、紐の長さを最短になるように、格子にはめて行きましょう。というイメージで考えます。

上記のようなイメージを持つと、点Sのある方向からでた紐は、点Tへ到着する方向は必ず一つに決まりまることがわかります(例えば、点Sの右側からでた紐は必ず点Tの下から到着しなければなりません、そうしないと紐が絡まります)。

以下S→Tに行く2パターンの時のことを考えます。T→Sは、右を左に、上を下に、それぞれ読み替えてください。

必ずSから見てTは、右上にあるので、右に進む、上に進む以外の動作はなるべくしたくありません。しかし、どうしてもしなくては行けない部分があります。先ほどの議論を思い出すと、点Sから右に出た紐は、必ず点Tの下にくっつきます。これと同様に、点Sの下からでた紐は、必ず点Tの左にくっつかねばなりません。この際、進行方向とは逆の方向に2回進まなければなりません。

このような議論を繰り返すと、2往復で合計4マス分進行方向とは逆に進まなければ行けないことがわかります。それ未満では条件を達成できませんし、それより大きいのは経路の無駄です。

反省

順番にやれと言われてる問題は、全部やってから無駄を省くというのは典型では?(exC - ハイスコア)

格子なり座標なりブロックなり、型にはめろって言われてる問題は、型を無視して見るのも典型では?(exC - Chocolate Bar

 

C - Reconciled?

問題概要

犬N匹と、猿M匹が必ず隣り合うような並び方は何通りあるか?

制約 1≦N,M≦10^5

考察

はじめに犬を並べます。そうすると、犬と犬の間はn-1出来ます。最低でもここに猿が入って貰わないと、犬同士が隣り合ってします。また、猿は、一番右もしくは左の犬の隣にも並べられます。それ以上並ぶと、今度は猿が隣り合ってしまいます。従って、

N - 1 ≦ M ≦ N + 1

|M - N| ≦1

|M - N| = {0,1}

が成り立たないならば、条件を満たす並び方は存在しないので、答えは0です。

また、上記の条件を満たすならば、犬の並べ方はN!通り、猿の並べ方はM!通りなので、N!*M!通り並べ方がありますが、|M - N| = 0の時、犬と猿を反転した並び方ができるので、並べ方の数は2倍となります。まとめると

|M - N| ≧ 2 ならば 0通り

|M - N| = 1 ならば M!*N!通り

|M - N| = 0 ならば 2*M!*N!通り

が答えとなります。

解答例

gist.github.com

 

int と long long int の掛け算ってダメなんでしょうか?謎な挙動をよく示す気がします...。

反省

2種類並べろは1種類先に全部並べる(ex:A - Happy Birthday!)

 

C - pushpush

問題概要

長さnの数列aと空の数列bがあり、以下の操作をi=1からi=Nまで繰り返します。

1. a[i]をbの末尾に加え、bを逆向きに並びかえる。

N回の操作終了後、bを求めなさい。

制約 1 ≦ n ≦ 2 * 10^5

考察

制約にシュミレーションがきつそうな気がした。

実験すると後ろからaを1個飛ばしに出力して、残りを前から出力すれば良いことがわかる。

ただ、実装方法思いつかない。

上に書いたようにやるとnの偶奇で分けなくちゃならない。めんどくさい。

ということで、出力したものは消して行くことにしました。

解答例

gist.github.com

dequeなるものと使うとシュミレーションできるのかな。

C - Splitting Pile

問題概要

素数Nの数列があり、1からi番目までの和をxi+1からN番目までの和をyとする。|x-y|の最小値を求めよ。

考察

見た目が累積和!!からバグらせたつらい。

 

自分的累積和まとめ

数列の部分和を高速に取り出す方法。

a[0]=b[0]

b[i]=b[i-1]+a[i]

i番目からj番目までの和は

b[j]-b[i-1]

解答例

gist.github.com

 

C - HSI

問題概要

プログラミングコンテストに出ている高橋くんは、1回目の提出でNケース中MケースでTLEしました。そこでMケースでは1900msかかり、1/2の確率で正解し、残りのN-Mケースでは100msで必ず正解しするプログラムに書き換えました。高橋くんが全てのケースを正解するのにかかる時間の期待値を求めなさい。

考察

解説ACしました。

まず、問題文が読めない。解説を見るまで求められているものが期待値ということがわかっていなかったので、無限等比級数とか考えてました(これでもできるらしいby解説放送のりんごさん。)

一回あたりにかかる時間をx、全てのケースで正解する確率をpとすると、

x=1900*M+100(N-M)

p=1/2^M

となります。それで、x/pが答えとなるらしい....。なんか納得いくような行かないような...要研究。

提出コード

gist.github.com

 

 

AtCoder ABC62-C Chocolate Bar

C - Chocolate Bar

 良い子のみんなは微分しちゃダメだぞ!!

実験的に思考過程を思い出しながら書いてみます。

理由は2つあります。

1つ目は解法と直接関係のない自分の思考を言語化することで、考察の無駄を省き、自分の思考の癖を発見し、考察力アップを図ることです。

2つ目は、マラソンで思考ログを公開してくれる方はよくいらっしゃるのですが、アルゴだとあまりいません。アルゴでやって見ても面白いかなと思ったからです。

問題の解説を求めてる方は、解法まとめへどうぞ。

目次 

問題概要

縦H、横Wをブロックに沿って3つの長方形に分ける。一番面積の大きい長方形と一番面積小さい長方形の面積の差の最小値を求めなさい。

2≦H,W≦10^5

思考過程

一番大きい面積の長方形の面積をS_{max}一番小さい面積の長方形の面積をS_{min}とします。

制約を見ます。O(HW)はダメなようです。

HかWが3の倍数なら均等に3等分出来るから答えは0。よって、どちらかが3の倍数の時は考える必要はありません。以下、HもWも3の倍数ではないとして扱います。これを一般化して、H、Wについてそれぞれmod3をとって場合分けしたらうまくいくんじゃないか、とか考えたけどうまくいきません。

 

切り方について考えます。

同じ方向に2回切る場合(縦縦、横横)と違う方向に1回ずつ切る場合(縦横、横縦)で計算方法が異なりそうなので分けて考えます。

 

同じ方向に切る場合。

縦に2回になるべく同じ大きさに切る場合、実験するとわかるのですが、同じ大きさの長方形2つと、それより幅が1だけ違う長方形ができます。(例えば、(H,W)=(5,7)の時、(5,2)(5,2)(5,3)の切り方が最善で、最大と最小の差は5になります。)このように、縦縦と切る場合S{max}S{min}は幅が1ブロック異なるだけなので、その差はHとなります。横に2回なるべく同じ大きさに切る場合も同様の議論でS{max}S{min}の差はWとなります。

よって、同じ方向に切る場合

S{max}-S{min}=min(H,W)

の時、左辺は最小となります。

 

違う方向に切る場合。

縦、横という順序で切る場合を考えます。順番を入れ替えても同様な議論ができます。お絵描きします。

f:id:guitarjoepass:20180627150627p:plain

 (チョコレートなので黒にしたのですが絶対見にくい)

左からaブロックのところを縦に切り、上からbブロックのところ横に切ります。そしてそれぞれの長方形をX,Y,Zとします。aとbを全探索すれば答えがでると一瞬考えましたが、O[HW]なのでダメです。aとbの範囲を絞る必要があります。ここでアホな僕はX-Y,Y-Zなどなどをa,bで偏微分すればなんかわかるんじゃね、とか考えました。場合分けと偏微分の手計算の沼に1時間半落ちました。流石にこれは変だと気づきます。

そもそも何がしたかったのかを考えます。S_{max}-S_{min}の最小化です。これが達成できた時はどんな時なのかを考えます。チョコレートを3等分に近くなるように分けた時です。なんで、厳密に3等分にできないのか考えます。ブロックがあるからです。ブロックを無視して見ましょう。

f:id:guitarjoepass:20180627152004p:plain

(W,H)=(10,7)の時の図です。

この時厳密に3等分出来るので、S_{max}-S_{min}=0となります。実際にはブロックがあるのでこのような分け方はできませんが、3等分に最も近い分け方のできるa,bはこの前後にありそうです。つまり、a=(3,4) b=(3,4)がa,bの候補であり、これら4パターンを全て試したどれかにS_{max}-S_{min}の最小値がありそうです。一般化すると、

a=W/3,W/3+1,b=H/2,H/2+1

X=aH,Y=b(W-a),Z=(W-a)(H-b)

となります。

 解法まとめ

同じ方向に2回切る場合と、違う方向1回ずつ切る場合で場合分けを行います。

①同じ方向に2回切る場合

HもしくはWが3で割り切れるならば、等しく3等分出来るので答えは0です。

そうでないならば、同じ面積の長方形2つと、それと幅が1ブロック分異なる長方形が出来るので、切った方向と平行の長さが答えになります。(縦向きに切ると縦の長さが答え)

 (H*W) mod 3 = 0 ならば ans=0

(H*W) mod 3 ≠ 0 ならば ans=min(H,W)

②違う方向で1回ずつ切る場合

f:id:guitarjoepass:20180627150627p:plain

XとYとZをできる限り等しくしたいです。つまり、X,Y,ZをそれぞれW*H/3に近づけるイメージです。そう考えると、a=(W/3,W/3+1)  ,   b=(H/2,H/2+1)がそれぞれa,bの候補であることがわかります。

 解答例

gist.github.com

 反省

・400点初ACなので嬉しい。

・図形を分割する問題。切り方の順序によって場合分けする解法。

・達成目標はなにで、それはどんな時達成されますか?という考え方。

微分しに行ったのは頭悪かった。そもそも、何がしたいのか意識するの大事。

・ブロックを無視して考察するの良かった。問題文から条件を1個取り除いて考察するのは考察の典型な気がする。

・思いっきり迷走したけど、解説見なかった自分えらい。

・思考ログを書き起こすタイプのアルゴの競プロブログってあまりない気がするのですがどうですか...?

 

2018/06/27  コードと本文中の説明で食い違いがあったので、コードの修正を行いました。

 

#include<bits/stdc++.h>
using namespace std;

int main(){
  long long int h,w,a,b;
  long long int ans,M,m,X,Y,Z;
  cin>>h>>w;
  if(h*w%3==0){
    cout<<0<<endl;
    return 0;
  }
	
  ans=min(h,w);
  for(int k=0;k<2;++k){
    for(int i=0;i<=1;++i){
      for(int j=0;j<=1;++j){
        a=w/3+i;b=h/2+j;
        X=a*h;
        Y=b*(w-a);
        Z=(w-a)*(h-b);
        M=max(X,Y);
        M=max(M,Z);
        m=min(X,Y);
        m=min(m,Z);
        ans=min(ans,M-m);	
      }
    }
    swap(h,w);
  }
  cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
  long long int h,w,a,b;
  long long int ans,M,m,X,Y,Z;
  cin>>h>>w;
  if(h*w%3==0){
    cout<<0<<endl;
    return 0;
  }
	
  ans=min(h,w);
  for(int k=0;k<2;++k){
    for(int i=0;i<=1;++i){
      for(int j=0;j<=1;++j){
        a=w/3+i;b=h/2+j;
        X=a*h;
        Y=b*(w-a);
        Z=(w-a)*(h-b);
        M=max(X,Y);
        M=max(M,Z);
        m=min(X,Y);
        m=min(m,Z);
        ans=min(ans,M-m);	
      }
    }
    swap(h,w);
  }
  cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
  long long int h,w,a,b;
  long long int ans,M,m,X,Y,Z;
  cin>>h>>w;
  if(h*w%3==0){
    cout<<0<<endl;
    return 0;
  }
	
  ans=min(h,w);
  for(int k=0;k<2;++k){
    for(int i=0;i<=1;++i){
      for(int j=0;j<=1;++j){
        a=w/3+i;b=h/2+j;
        X=a*h;
        Y=b*(w-a);
        Z=(w-a)*(h-b);
        M=max(X,Y);
        M=max(M,Z);
        m=min(X,Y);
        m=min(m,Z);
        ans=min(ans,M-m);	
      }
    }
    swap(h,w);
  }
  cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
  long long int h,w,a,b;
  long long int ans,M,m,X,Y,Z;
  cin>>h>>w;
  if(h*w%3==0){
    cout<<0<<endl;
    return 0;
  }
	
  ans=min(h,w);
  for(int k=0;k<2;++k){
    for(int i=0;i<=1;++i){
      for(int j=0;j<=1;++j){
        a=w/3+i;b=h/2+j;
        X=a*h;
        Y=b*(w-a);
        Z=(w-a)*(h-b);
        M=max(X,Y);
        M=max(M,Z);
        m=min(X,Y);
        m=min(m,Z);
        ans=min(ans,M-m);	
      }
    }
    swap(h,w);
  }
  cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
  long long int h,w,a,b;
  long long int ans,M,m,X,Y,Z;
  cin>>h>>w;
  if(h*w%3==0){
    cout<<0<<endl;
    return 0;
  }
	
  ans=min(h,w);
  for(int k=0;k<2;++k){
    for(int i=0;i<=1;++i){
      for(int j=0;j<=1;++j){
        a=w/3+i;b=h/2+j;
        X=a*h;
        Y=b*(w-a);
        Z=(w-a)*(h-b);
        M=max(X,Y);
        M=max(M,Z);
        m=min(X,Y);
        m=min(m,Z);
        ans=min(ans,M-m);	
      }
    }
    swap(h,w);
  }
  cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
  long long int h,w,a,b;
  long long int ans,M,m,X,Y,Z;
  cin>>h>>w;
  if(h*w%3==0){
    cout<<0<<endl;
    return 0;
  }
	
  ans=min(h,w);
  for(int k=0;k<2;++k){
    for(int i=0;i<=1;++i){
      for(int j=0;j<=1;++j){
        a=w/3+i;b=h/2+j;
        X=a*h;
        Y=b*(w-a);
        Z=(w-a)*(h-b);
        M=max(X,Y);
        M=max(M,Z);
        m=min(X,Y);
        m=min(m,Z);
        ans=min(ans,M-m);	
      }
    }
    swap(h,w);
  }
  cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
  long long int h,w,a,b;
  long long int ans,M,m,X,Y,Z;
  cin>>h>>w;
  if(h*w%3==0){
    cout<<0<<endl;
    return 0;
  }
	
  ans=min(h,w);
  for(int k=0;k<2;++k){
    for(int i=0;i<=1;++i){
      for(int j=0;j<=1;++j){
        a=w/3+i;b=h/2+j;
        X=a*h;
        Y=b*(w-a);
        Z=(w-a)*(h-b);
        M=max(X,Y);
        M=max(M,Z);
        m=min(X,Y);
        m=min(m,Z);
        ans=min(ans,M-m);	
      }
    }
    swap(h,w);
  }
  cout<<ans<<endl;