/ 最近 .rdf 追記 設定 本棚

脳log[2025-07-02~]



2025年07月02日 (水) [AtCoder] 土曜日に日本最強プログラマー学生選手権~Advance~ -予選- (ABC412)があった。なかったことにしようと思ったけど火曜日に E が解けたので存在を認めてやらないではない。■A 問題 Task Failed Successfully。無加工で使用できる比較対象が同時に与えられる親切さはさすがの A 問題。だけど昔はループが必要なかったらしいです。■B 問題 Precondition。いつものごとく upcase とか uppercase とかガチャガチャやってみて当たりが引けなかったのでリファレンスを調べたら、どうやら大文字小文字を調べるメソッドはないみたいだった。びっくり。制約から特定の1ビットを調べるだけでわかるのは知ってるんだけど、どのビットかは覚えていないし、鼻につく感じもするので、大文字化して元の文字と比較するという馬鹿みたいなやり方でやった。■C 問題 Giant Domino。ドミノ1とドミノ N を抜き出してから他はソートする。貪欲法で必要な限り可能な限り最大のドミノにサイズアップしていく。■D 問題 Make 2-Regular Graph。順列が通る制約。やるだけではあるんだけど、短時間でやりきれなかった。やることは勘違いしていなかった。1個以上の輪っかのグラフを作る。輪っかの大きさは3頂点以上である必要がある(多重辺が許されていないので)。このときに輪っかの数が最大でも2個までだということに気がつけなかったのが敗因か。そうでもない。各順列に対してどこで輪っかを作るかというのを DFS で全探索する最初の方針で実装して AC だったのだから。N の階乗(頂点列の並べ替え)に2の N 乗(各頂点で伸ばす/輪になるの2択)を掛けてもまだ間に合う制約だというのも確認していた。D 問題に時間をかけすぎだと判断して途中で E 問題に行く原因になったのは何か。消す辺足す辺の数勘定ができなかった。すごく面倒くさかった。やりたくなかった。それならしかたないね。■E 問題 LCM Sequence。解けるまで2晩かかった。D 問題の AC が終了5分前だったので、当日は終了 30 秒前に未完成のものを提出するしかなかった (#67164359 TLE×19)。コメントにあるように素数判定に時間を使い過ぎている。翌日になって調和級数的な計算量で合成数をはじけば素数判定はいらないなと思って提出したものは WA×5 だった (#67182611)。制約で区間の幅が計算可能な大きさ(10^7)に制限されている意味はわかっていたつもりだけど、区間の上限が (10^7)^2 だということとその意味に気がついていなかった。十分な大きさの素数までを列挙すれば、1つの素数のべき乗(2,4,8,16……など)とすべての合成数(4,6,8,10,……など)が列挙できて、消去法で区間内に高々1度しか現れない大きな素数も見つけられるんだけど、「十分な大きさ」を決めるのは区間の幅ではなかったのだった。提出 #67224096 (AC)。■F 問題 Socks 4。N すくみ的な状況。手持ちの靴下を C→D(→E)→C と入れ替えて戻すのは必ずどこかで判断ミスをしているので堂堂巡に陥る心配はしないけど、問題設定がすこしでも複雑になると自己ループの除去とかできなくなる。■火曜日……2晩……。6月30日は ABC412 の代わりに消えた?


2025年07月01日 (火) ちょっと前に発表されたシマノのバッテリーレス自動変速。「「これ、アシストしてくれてるんですか?って聞かれたことがありました。でも違うんです。ギアが合ってるだけで、脚力だけで登れているんですよ、って言うとすごくびっくりするんです。それを知らなかった人にとっては、本当に新しい発見なんです。 僕らスポーツバイクに乗り慣れている人は自然と変速操作をやってるけど、普通の人はできないんですよ。 ちょっと重めのギアに固定してずっと乗ってる人、坂で軽いギアに変えれば良いのに降りて押す人、よく見ますよね。でもQ'AUTOなら、限られたパワーを引き出して、うまく走れせてくれる。これって実はすごいことなんです。」■これはちょっとわかる。小中高と自転車に乗っていて、3段変速、20何段変速とあっても、がんばってなんとかなるあいだはシフトダウンするよりもがんばってしまう。車とバイクの免許をとってから自転車の変速マナーが変わったのを覚えている。だってね、エンジンは自分と違ってちっともがんばってくれなくてすぐにエンストするからね、シフトダウンするしかない。それで自転車でもがんばる前にシフトダウンをするようになった。エンジンも人間もほどよい負荷でくるくる回すのが一番効率がいいし、特に非力な人間はそのゾーンが狭いのだから、どんどん変速をするのがいい。


2025年06月21日 (土) [AtCoder] 今日はユニークビジョンプログラミングコンテスト2025 夏(ABC411)があった。F は解けても良さそうな気がするなー。■A 問題 Required Length。はい。■B 問題 Distance Table。累積和でやったけどその必要もない制約だった。というかね、累積和を作成するのと答えを出力するのが同時に行えるのだから、事前に累積和を作成するひと手間が完全に無駄だったよね。■C 問題 Black Intervals。左右の端に番兵(白石)を置くと境界条件が省けて便利。前後を合わせて石3つで3ビット(8通り)の場合分けを書いて1通りだけ間違えて1ペナルティ。私は具体例を出して数の増減が数えられません。■D 問題 Conflict 2。配点がやや上振れ。だけどひょっとして Ruby だとやるだけなのでは? と思って提出してまんまと TLE を食らいました (#66944990)。Array だと前後への要素の追加(unshift/push)でサイズが倍々的に増えていくからメモリの確保回数が節約できるのだけど、文字列の破壊的変更はそうではないのだろうか。Array には copy on write もあるけど文字列にはないのだろうか。それともそうであっても許されない制約だったのだろうか。前の要素を参照するリンクリスト的な構造を Q 個作成して、最後に逆順にたどって連結した。クエリを逆順に見て最終的に影響のあるクエリ2だけをピックアップできるかなとも一瞬考えたけど、一瞬で断念した。■E 問題 E [max]。最初しばらく勘違いしていたんだけど、余事象とか包含関係を求めやすさで整理した結果、答えを出すのに必要なものは、有効な面が0~6面のダイスがそれぞれ何個ずつあるかという集計。有効な面とは何か。たとえば最大値を X としたいとき、その確率は X 以下の面のみが出る確率引く X 未満の面のみが出る確率。最大値を大きい数から順に下げていくのにあわせて有効な面を減らしていき、その都度確率を計算する。期待値は最大値掛ける確率。答えが合わないので一度小数で計算して過程を表示するなどした。掛けるで繋げるべき計算を足すで繋いでいたのが原因で間違えていた。mod のままではそういうしょうもない計算ミスを見つけるのも難しい。2.5 秒かかったので制限時間が3秒で助かった。÷6^N をループの外に出してこれなので、もし2秒制限で TLE だったら、2,3,(4),5,(6) の N 乗までを前計算したりしたかな。あと、前後のループの後半と前半で確率の値が使い回しできそう。……ということは、ループ全体で足し引きを通算して再構成するともっと演算が減りそう。考察が足りなくて最適解が見えていない可能性。■F 問題 Contraction。制限時間が4秒。やや高の 525 点。辺をマージするだけなのかなと素朴すぎる方針を立てて実装したところ、およそ1秒で時間は間に合ったけど WA が多数 (#66981976)。必要な処理を抜かして時間を稼いでいる疑い。■■■F 問題。終了 12 分後に提出したものは WA×31 だった (さっきの提出)。翌朝目覚めたらデバッグが完了していた (#66988575)。頂点 a と b をマージして a が代表として残るとき、b とのみ辺で繋がっている頂点 c を a に付け替える。そのときに辺を a と c 双方に登録しなければいけないところ、a から生やす辺を忘れていた (30 行目)。やっぱり時間内(E 問題に 40 分かけたがまだ 30 分と少し残っていた)に解けてほしい難易度の問題だったけど、実際にはひと晩(≠ひと晩中)かかったなあ。解答に使った知識は UnionFind とマージテク。■今日ある第六回日本最強プログラマー学生選手権-予選-(ARC201)には参加しません。最初の2問が 500 点だけど、どう考えてもはりきった出題者が一筋縄ではいかないひねった問題骨太な問題を出してくるに決まってるんです。先週の ARC200 (div.2) の A 問題 (500 点) が解けなくてゼロ完だったことで私はいたく傷ついています。■■■D 問題。Array でやってもだめだった (TLE×13)。ちなみに String だと TLE×12 だったから、Array よりマシ。そして、クエリ逆読みをやってみたら WA×18 だった。「一瞬で断念した」だけのことはある。デバッグ完了 (AC)。それから最初の解法だけど、リンクリストのノードは Q 個ではなくクエリ2の数だけで十分みたいだった。クエリ1と3でコピーしなければいけない気がして自分は空文字列を追加した体で新しいノードを作ったんだけど、一度作ったノードは不変なのだから、参照をコピーしてノードを共有するやり方で問題なかった。


2025年06月14日 (土) [AtCoder] 今日は CodeQUEEN 2025 予選 (ABC410) があった。問題の傾向として JOI に近いのだろうか。典型的な基礎知識が確実に身についているかを確かめる感じ。だからってそれが必ずしも簡単なわけじゃない。DP ひとつとってもいくらでも難しくなる。難易度はともかく、DP は必ず押さえておいてほしい知識のひとつとか、発想より実装みたいな傾向を感じた。結果は、まるで進歩が見られない。自分だけ前に進んでいないのだからそれは後退と一緒。■A 問題 G1。数えます。■B 問題 Reverse Proxy。シミュレートします。■C 問題 Rotatable Array。rotate をシミュレートする代わりに先頭へのポインタを動かす。添字の1始まりと0始まりの差を埋めるために N+1 要素の配列を用意してサンプルが合わずにグダってしまった。正しい対処法は、N 要素の配列を用意して、先頭へのポインタの初期値を N-1 にすることだった。■D 問題 XOR Shortest Walk。先々週の ABC408-E「Minimum OR Path」の OR が XOR だったら……という仮定がコンテスト後に見られました。期待に応えて? 閉路でどうなるかなと思ったけど、チカチカするだけだった。「だけ」といってチカとチカとチカの組み合わせは2のべき乗で増えていくのだけど、それとは関係なく頂点数 1000 に対して状態数が 1024 なので、全部やって間に合います。1<<10 を計算して確かめたので間違いない(あまり見慣れない制約なので 10 ビットとゼロ3つの対応が思い出せなかった)。■E 問題 Battles in a Row。体力の高さと魔力の高さはトレードオフの関係にあるので、体力に対して最大の魔力を記録する DP をした。2乗が間に合う。ところで、「体力に対して最大の魔力を記録する DP」のどこが「体力の高さと魔力の高さはトレードオフの関係にあるので」なのかは判然としない。本当は「HP が低くなるなら MP は高くならないといけないよ」という DP をしようとしたのだけど、実装が混乱したので一旦すべての HP をフラットに扱う素直な実装を書いて、それをそのまま提出したのだった。■F 問題 Balanced Rectangles。対角を決めれば中身は数えられる。問題は対角の選び方が2乗のオーダーになること。どうやって効率良く数えるのかわかりません。短い方の辺の2乗なら許されるとしても、長辺方向の累積和で何もうまくできない。■G 問題 Longest Chord Chain。ABC402-D「Line Crossing」、ABC405-F「Chord Crossing」から続く3問目。おかげで問題の把握は容易。まずある弦を選ぶ。その右側と左側に対してそれぞれ平行な(平行になるように移動できる)弦が最大何本選べるかがわかればいい。これは再帰的に DP で求められる。わからないのは、左右にあるどの弦が再帰の次のステップとして最適か。これを逐次的に選ぶのでは全体で2乗のオーダーになって間に合わない。次のステップの候補が連続してすきまなく並んでいるのならセグメント木に載せて最適解を対数時間で選べるが、左右を分ける弦と交差する弦をクエリ範囲から取り除かなければ誤った答えを選んでしまう。ということを今この日記に書いていて思ったのだけど、交差する弦をセグメント木から一時的に除外することが可能なのではないか。除外したり復元したりの回数は全部で 2N 回なのでは? この思いつきを実装しようとすると、弦に対して交差する弦のリストを作成すること、再帰の末尾に当たるどの要素からセグメント木を埋めなければいけないか、範囲の左右を分ける区切りとセグメント木の先頭末尾の区切りの不一致から扱う範囲が実質的に3つになることなど、気が遠くなるほど道のりが長い。2乗の解答を書くだけですでに疲弊しているというのに。しかもこの2乗の解答が (TLE に加えて) WA を出す可能性が6、7割くらいあると思ってるよ。それだけややこしいし、方針にも確信が持てない。■■■F 問題。この累積和の使い方、解いたことある。ABC338-G「evall」(「範囲の両端が + の内側にある場合の寄与は、これは累積和の問題として単独で D 問題あたりにでもなりそうな難易度の問題」)。次元がひとつ増えるだけでキャパシティをオーバーして、できることとできることの足し算ができないことになってしまうのでした。提出 #66801656 (TLE×20/AC×23)。ダメです。


2025年06月12日 (木) 舞洲万博P&R駐車場の待機場における自動運転バス車両のコンクリート擁壁接触事故の原因と今後の対応について|Osaka Metro」■「[B! 事故] 万博・自動運転バス事故『原因=車両が受信できない速度(500kbps)でデータ送信していた』大量のエラーデータで必要なブレーキ情報伝わらず…大阪メトロ | MBSニュース」■電動(?)パーキングが作動するための条件の1つであるフットブレーキ操作の記録が押し流されて確認できず、結果としてパーキングブレーキが作動しなかった。アクセルブレーキハンドル操作は普通にできる状態だったが、パーキングブレーキに穴があった。「当該車両の運転士が車両のパーキングブレーキシステムをオンにし、待機場停車時にフットブレーキ操作を行ったにもかかわらず、パーキングブレーキが有効に作動しなかった」ときにどんなフィードバックがあったのかなかったのか。これはブレーキをかけることとブレーキがかかることが一致しなかった例。自分は古い人間なのでこの2つがワイヤーで直結している(力学的)システムが好きです(大型車両で補助動力がうんぬんはおいといて、自分が乗る車は)。ちなみに自動運転のエラーではなく手動操作中の事故。しかし原因は(車内の?)通信ネットワークにある。


2025年06月07日 (土) [AtCoder] 今日は AtCoder Beginner Contest 409 があった。■A 問題 Conflict。縦に見て ○○ を探す。■B 問題 Citation。1回間違えて愚直二乗解法で書き直した。与えられた値の中に答えがあると思い込んだわけではないのだ。それも想定して、でも反例が出てこなくて間違えた。とても難しい問題。以前から書いてるけど、否定で定義される MEX みたいな問題が苦手。問題名は引用かなと思ったけど意味がわからない。調べたら召喚状、出頭(罰金)命令書、賞状といった意味が出てきた。意味があまりにとっちらかっている。形式に対する名称なの? なんにせよどれもしっくりこないような。■C 問題 Equilateral Triangle。円周 L を3等分して L/3 個の三つ組の掛け合わせの和。■D 問題 String Rotation。まず先頭に近い方から前後ペアを見つける。どのような。前後が大小の順番で並んでいるペア。次は見つけたペアの大きい文字をどれだけ後ろへ送るかを決める。より大きな文字の前か最後尾。■E 問題 Pair Annihilation。焼きなまし?(問題名←それは annealing こちらは対消滅) F 問題より考えた。最小全域木的な操作や重み付き UnionFind を考えたけど、うまくない。葉からの DP (with マージソート)を考えたけど、うまくない。実は葉から貪欲にペアを作っていくのが最善だった。それがわかればあとはがんばって書く。■F 問題 Connecting Points。2乗が通るのでやるだけですか? TLE×3 だった(#66577100)。もうええやないですか。通してください。できることはもうやってるんです。プライオリティキューに無駄要素が詰まりがちだから、値が重複しないように気をつけました(プライオリティキューにはユニークな距離の値だけを入れ、距離に対応した頂点対リストは Hash に入れた)。新頂点を追加するときに点間距離ではなく連結成分対新頂点の最短距離をソートによらず選び出すことでさらにキューに入れる要素を減らそうとしたら、これは遅くなりました(TLE×7)。お手上げ。


2025年06月05日 (木) CD2WAV32 for Windows11 Revision 4.00jpをリリースしました – 新しい経験の日々の記録」■4月に6年ぶりに CD を買ったので旧バージョンを利用したところ。2月に Vista から 11 に移行したので 11 対応はいいタイミング。次 CD を買うのが何年後か知らないけども。


2025年06月04日 (水) 前々から予測していた危険がみごとにその通りになった。戸を開けて包丁をしまうときにね、今落とすと(先に見えている)足があぶないなとスリッパを履いてる方が安全だなと思っていたのだった。今日は靴下も履いていなかった。ゴツッと親指の付け根の骨にぶつかって皮一枚だったのが幸い。手を滑らせたこと、ぶつかったこと、当たったのが峰でなかったことが不運。回転していたし赤い筋も見えなかったので幸運を期待したのだけど。


2025年06月03日 (火) [AtCoder] 精進。ABC096-D「Five, Five Everywhere」(水 diff)。提出 #66415672 (AC / 85 Byte / 212 ms)。サンプル以外のケースが2つしかないのね。N=55 とあとはなんだろう(N=5 はサンプルにある)。解答のマジックナンバーも5だった。タイトルに偽りなし。解けてみたらこれ以外にないという感じだけど、解けない。この問題は何度も埋め損ねて残っている問題のひとつだった。N が小さいし候補となる素数の数も知れてるし、実際に組み合わせてみてフィルタするうまい方法がないかを最初は考えた。でも 50 の 5 乗に近い組み合わせは考えられない。その次に、特定の余りの組み合わせが特定の余りに限定されるということがあるなと思って、2とか3とか4の余りについて考えていた。2の余りによる分類は偶数奇数ということでほぼ意味がない。2以外の素数はすべて奇数なので。問題が5個の組み合わせでなく偶数個の組み合わせだったら、奇数を組み合わせてできあがる数は2より大きい偶数(≠素数)だということで簡単だった。次に3の余りを考えたけど、ポンコツだったのは、3で割って1余る数は必ずしも偶数ではないんですよ。3の倍数も奇数に限らない。それが偶数だ奇数だと勘違いして無駄に時間を使った。次に4。4で割った余りによる分類は偶奇偶奇と分かれるので、それで3で割った余りを勘違いしたんだろうなあ。4で割る理由は奇数の素数を2派に分けられるから。でも分けて嬉しいことはなかった。次が……。


2025年05月31日 (土) [AtCoder] 今日は AtCoder Beginner Contest 408 があった。D 問題に全部持って行かれた。全部ではないな。E と F の点数 950 点と D の点数 400 点を持って行かれた。難易度が F<E<D の順で逆転していた。■A 問題 Timeout。今日は A 問題から不調を感じていた。+0.5 秒がまじで嫌い。長老が寝る瞬間に長老は起きているのか寝ているのかという問題が生じないためであるのはわかる。目的はわかるけどそれを処理する頭がない。だから嫌い。今日はごちゃごちゃ細かいことが考えられない。■B 問題 Compression。uniq、sort. ■C 問題 Not All Covered。端から順に見ていってそこをカバーしている砲台の数を数える。■E 問題 Minimum OR Path。単純パスというのは考えなくてもいい。寄り道をして得をすることがないので。ラベルのビットには明確な序列がある。1<<k を含むラベルを使わないで済むなら、1<<k 未満のラベルはすべて使ってしまって構わない。この論法で最上位ビットから決めていく。UnionFind で 1 と N の連結非連結を確かめながら。TLE を1回出した。マスクしたウェイトに基づいて辺をソートしてから UnionFind をしたのが原因。ソートがいけない。ソートするより一辺一辺使用するかしないかを判断する線形時間の処理の方が軽い。■F 問題 Athletic。セグメント木が使えますかという問題。高橋君のいる高さは狭義単調減少なので、高さの低い方からあと何回ジャンプできるかを求めてセグメント木に乗せていく。高さが近すぎるとジャンプできないので、求めた回数をすぐにはセグメント木にセットせず、キューに入れて遅延させる。それだけ。■D 問題 Flip to Gather。ある1の島を、残す1の左端にすると決める。そうするとそこより左にある1の数だけ操作が必要。同じことを右側についても求める。左端と右端を決めたら左右の消すべき1の数と真ん中の消すべき0の数がわかる。2乗の解法は許されないからどうする。尺取り? あのですね、人間のワーキングメモリには個人差があって、自分は頭が働くときでも3段4段の処理は脳内スタックからあふれてしまう。DP をするときだって in-place で書き換えたり保持するものを前後の2系列に限ったりすることで添え字が3つ以上にならないように工夫している。というかそうする方が楽だし解きやすいので自然そうなる。1+1+1+1 = 4 ではないんです。3までは線形に増えていってもその次はスタックオーバーフローで実行が完了しないんです。こういう限界の低さをふまえて出題してもらいたい。D 問題に解けない問題を置かないでほしい。■■■A 問題。嫌いな嫌いな +0.5 秒問題。自分について理解した。たとえば問題文が「最後に肩を叩かれてから S 秒後まで長老は起きています。(最後に肩を叩かれてから) S+1 秒後には寝ています」だったらすんなり頭に入ってくる。次からこう読めばいいと理解した。S と S+1 という2つのパラメータを S というひとつの値で表すために +0.5 秒というやっかいものを導入して、「あとはわかるな」で済ませるから話がややこしくなるのだ。きっちり文章にしてくれないとわかりません。


2025年05月25日 (日) [AtCoder] 今日は AtCoder Regular Contest 198 (Div. 2)。■A 問題 I hate 1。こういうのをギャグというのだろうか。AtCoder で一発ネタを見ることってない。たとえば2を追加するとすべての奇数が追加できなくなる。一方で、2の倍数は余りが0なので追加することができる。なので S の要素は素数の倍数が良さそう? ほぼ半数を要素にできる2の倍数以上にすぐれた選択肢ってある? 問題の難しさを認識することさえできなくて過度に単純化した結果 WA を出すというのが ARC あるあるだしなあ、でも 300 点問題だしなあと数分逡巡してから(反例となる素数の組み合わせも見つからなかったので)提出して AC だった。■B 問題 I hate 1。問題を読んで具体例を確かめていくと、01100[1]2[1]0 しか作れないとわかる。2の両隣の1はオプション。0 はいくつ連続で並べてもいいので、11[1]2[1]0 で区切るイメージ。まずは消費の仕方が限られている2を消費したい。2を消費するのに十分な0の数は2と同数。これは数列が環状に循環しているから。次に1を消費したい。2の両隣の1はオプションだから、2の倍の数までは何も考えずに消費できる。余りは 11 として2の島と同様に同数の0で区切る必要がある。余りの1が奇数個の場合が面倒。2の隣の1をひとつ持って来られるなら良し。持って来られない(2がゼロ個)なら即座に No。実装ミス(A = A-B-BA -= B-B とした)と勘違い(ひとつのことを実装しているあいだにもうひとつのことが曖昧になっていくせい)で2ペナ。■本日の ARC は終了です。時間をオーバーして C 問題の実装を終わらせたけど、シャッフルした順列をソート済みに並べ替えようとすると最後の2要素が一致しない。操作対象が2要素だけだと自由度がなくていけない。1要素を加えた3要素を手で操作してなんとかできないかやってみたけどどうにも完成させられなかった。えっ? 全体の和が一致していても不可能なケースがある?(ないよね) N=2 だけでなく N=3 も場合分けが必要?


2025年05月24日 (土) [AtCoder] ABC407。死亡。E 問題、2乗の DP を、やらせてください。F 問題、2乗の解法で、勘弁してください。どちらも許されないもよう。今日は A 問題からドキドキで WJ を眺めていたし、B 問題はなんとなくで総当たりの解法を見つけただけだし、C 問題と D 問題でやっと普通にやるだけだと感じられた。そして EF で死亡。■■■驚きました。コンテスト成績証。1391 水パフォで +8 レートだった。これで上がる自分のレベルの低さに驚きました。


2025年05月22日 (木) プログラマーの性格が悪く見えるのは日常生活をRFCやソースコードとして解釈しているから説 - hitode909の日記」■「日常会話、RFC説」おもしろいなあ。俺も言いたいことがあるよ。結果に関して明らかに MUST を要求してきてるのに、コストに注目して「それは MUST ですか」って聞くとそうは言っていない (MUST じゃない) (MAY だ) っていう人が、だけど要求は下げない人が、いるんだよ。「自主~」を要求するみたいな国はそういう人間でできています。■■■「68行目にごちゃごちゃやってますが、これはNと111...(下から数えて0埋めしたい桁数)...1を&演算してNの下digit_from_bottom桁を抜き出し、Nからこれを引いて下digit_from_bottom桁を0埋めした数字です。もっとスマートにやる計算方法があるのでしょうか? 誰か教えてください」 自分だったら masked_max_m = max>>digit_from_bottom<<digit_from_bottom って書くかなあ。特に罠もないと思う。符号は罠にならないし(非負だよね?)、シフト数の罠(明らかなシフトしすぎは未定義)は書き方によらないし (Rust の罠は知らないよ)。あと、20250517 に書き足したことだけど、以下と未満の差を埋めるのは n に予め1を足しておくだけでいいみたい?