ラベル オイラーのφ関数 の投稿を表示しています。 すべての投稿を表示
ラベル オイラーのφ関数 の投稿を表示しています。 すべての投稿を表示

2025年7月26日土曜日

yukicoder contest 475 (ゆるCafe)

 ABDEの四完。

コンテスト後のツイート

No.3211 NAND Oracle

 多少解法ツイートを見たけど、大体自力AC。

 「何度か操作したら、どの場合でも必ず0」という操作を手作業で探した。
 ただ、この方法だと1WAになり、実はQ=5、K=4の場合も構築できた。(これも手作業で探した)

No.3214 small square

 解説AC。

 平面走査を思いつかなかったのは本当に良くない。片方の座標を順に見ていき平面走査……というのは、こういう問題ではまず考えるべき解法でした。

No.3215 Make K types-able

 解説AC。簡単だと言っていたツイートを見たので考えたけれど自力で解けず。

 木を、ROOTとそれ以外の二つの部分に分割して考えるという方針が思いつけなかった。解説を見た後も、ベキ乗のmodに関する部分で詰まってしまい大変だった。

 

2025年2月25日火曜日

yukicoder contest 457

 AHCの最中だったため、Aだけ解いて撤退。


No.3028 No.9999

 一見、何も分からなかったが、タグの「循環小数」というのを見て、循環節の長さと一致することに気付く。
 それでも分からなかったので、ChatGPTに解き方を聞いてみたところ、コードを教えてくれ、そのままAC。

 $10^L=1$(mod $x$)を満たす最小のLは10のxに対する位数と一致し、これはトーシェント関数の約数のうち最小のものなので、トーシェント関数の約数のみを試せば良い、という解説も分かりやすい。

 トーシェント関数のライブラリも、自前のものよりこっちの方が良いのかと、考えてしまう。

No.3029 オイラー標数

 setにソートしたものを放り込んでいき、AC。

 クエリの与えられ方の意味がぱっと分からなかったけど、三角形をなす三頂点をどんどん与えられているということなんですね。

No.3030 Kruskal-Katona

 定理の名前で検索したら、貪欲で良いと書いてあったためAC。

 なお、N_i=N_i-1+1じゃなくてはいけないと定理を検索するまで誤解していた。サンプルの答えが全部連続した数なのが分かりにくくしている気がする。

No.3031 曲面の向き付け

 自力AC。タグのDFSはヒントにした。

 問題を理解するのが難しいが、理解したら面白い内容で、難しくはなかった。数学的な問題文は理解するのに時間がかかってしまうね。

2024年10月17日木曜日

AtCoder Regular Contest 185

 AB二完。

コンテスト後のツイート

C - Sum of Three Integers

 解説放送を見てAC。

 FFTは全く考えなかったが、登場回数の配列同士を畳み込めば、二つの配列の和の要素の登場回数になる……というのは初見ではなかったかもしれない(よく覚えていないが)。これは身に着けておきたい。

 ただ、解法が分かった後もACに非常に苦労した。ランダムケースで実行しても何で落ちているのかが分からず、かなりたくさん提出デバッグをしてしまった。

・PythonでFFTを使うなら、配列をnumpy.arrayで書き、np.fft.rfft(A,k)やnp.fft.irfft(f)を使うと速い。
・畳み込み後の要素の値が大きくなることがあるため、np.fft.rfft(A,k)のkの値をギリギリに取るのではダメ。最大値をきちんと見積もる。

 このあたりが問題だった。気を付けないと。

D - Random Walk on Tree

 解説放送を見てAC。

 解説放送で一番難しいといっていたパートは、ChatGPTに「ランダムウォークで、スタート地点からn歩の点にはじめて到達する歩数の期待値を教えて下さい。」と聞いたら、「スタート地点 0 から n に初めて到達するまでの期待値は、1次元ランダムウォークでは次のように表せます:

・En=n^2 つまり、最初に n に到達するための期待歩数は n^2  です。」と正しい返事がきた。

 また、コンプガチャについてはけんちょんさんの記事など詳しいものがある。

 どちらも、自力で導出できると良いけど、覚えておいても良いくらいの内容な気がする。

 なので、対称性に関する考察さえきちんと行ってどんな問題に帰着できるか分かれば、あとは知識(もしくは調べて)で解けたんですね。

E - Adjacent GCD

 解説放送を見てAC。

 約数包除を行うとき、各素数についての他次元平面と考えると分かりやすい、というのは知っていた(が、コンテスト中は出てこなかった)。
 
 で、約数包除のとき、あるxについて、その約数に関する値の総和を取るとxになるような値があると良い。そういうのがあれば、毎回包除をして約数の個数^2の計算時間をかけず、約数の箇所にある値の和を取る/値を書き込むさえすれば、毎回約数の個数回の計算時間で済む。

 それを実現するのが、オイラーのトーシェント関数だった!

 オイラーのトーシェント関数の定義を考えれば簡単に分かることなのだが、はじめて知りました。
 約数包除に関して理解できた気がするので、もう忘れないといいな……。

 なお、今回の問題は、100000までのトーシェント関数の値と約数のリストを予め列挙してACしました。

2022年11月6日日曜日

yukicoder contest 367

 Bまで二完。


No.2119 一般化百五減算

 順番に中国剰余定理を使っていけば良いのは分かったが、TLEが取れなかった。

 TLEの原因は、割る数が大きくなり過ぎることを忘れていたため。割られる数が大きくなったときをケアするだけなく、割る数の方が大きくなったときについてもきちんと調べなくてはいけなかった。

No.2120 場合の数の下8桁

 教育的な問題。やり方を全然覚えていなかった……。

 2ベキ、5ベキ、それ以外で分ける。
 2ベキや5ベキを除いた部分は、$2^8$や$5^8$をmodとしたとき可逆になっているため、オイラーのトーシェント関数を使えば「何乗すれば逆数になるか?」が分かる(なお、Pythonならpow(x,-1,mod)でOK)ので、計算可能。それぞれ計算し、中国剰余定理によって復元できる。

2021年5月5日水曜日

FIICode 2021 Round #2

  二完でした。


Clown Fiesta

 解説AC。
 「オイラーのφ関数」に関する理解が乏しかった。

 Editorialにある次の式は覚えておいてもいいと思う。

・$a^b = a^{b \,\,\mathrm{mod}\,\, \varphi (m)}(\mathrm{mod}\,\,m)$
・$a^{b^c} = a^{b^{c \,\, \mathrm{mod}\,\,\varphi (\varphi (m))} \,\,\mathrm{mod} \,\,\varphi (m)}(\mathrm{mod}\,\,m)$

(もちろん、「覚えておいてもいい」は言葉の綾で、「オイラーのφ関数を使う」ということさえ記憶しておけば導出は簡単なので覚える必要はない)

 これをふまえると、mod mで考えるとき、ベキ乗の肩にたくさんの数が乗っていても途中から(それも、mが小さければ結構すぐに)無視できるということになる。(この問題もそれを利用して解く)
 競技プログラミングをやっていれば知っていて当然の知識だろうけど、ちょっと驚いた。

2021年1月15日金曜日

yukicoder contest 278

 Fまで六完。Eで苦戦してしまったけど、F解けて良かった。


No.1339 循環小数

 解説を読むとシンプルですね。
 検索で解法に至れた(よく分からないまま提出してしまったけど、自分のコードは解法と一致してそう)のは良かったけども……。

 オイラーのφ関数を頭に入れておかないと。

No.1340 おーじ君をさがせ

 行列累乗はすぐ思いついたので、時間もなかったし、適当なmodで投げたら通った。

 しかし、解説のように別の演算で行列累乗するという方法は浮かばなかった。解説にもある類題は解いたことあったのに、思い浮かばなかったのは良くない。