geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

AtCoder Beginner Contest 254

コンテスト中AC:A〜C,E
AtCoder Beginner Contest 254 - AtCoder

解けなかったDを解説見てACしたので少しだけ付け足しして書いておきます。

D - Together Square

この問題では、以下の命題が重要そうです。

i\times jが平方数となるための必要十分条件は、任意の素数pについて、i,jに含まれるpの個数の偶奇が等しい

厳密な証明までは必要なさそうですが、一応理解を深めるため、ここでは証明しておきます。(素人なので、間違っていたらすみません)

まず、以下の補題を証明します。

整数Xが平方数である\Leftrightarrow任意の素数pについて、Xに含まれるpの個数が偶数

[証明]

[ \Rightarrow ]Xは平方数であるから、x=\sqrt{X}を満たす整数xが存在する。x素因数分解x=p_1^{a_1}\times p_2^{a_2}\times \cdots  \times p_k^{a_k}とすると、
X=x^2=(p_1^{a_1}\times p_2^{a_2}\times \cdots \times p_k^{a_k})\times (p_1^{a_1}\times p_2^{a_2}\times \cdots \times p_k^{a_l})=p_1^{2a_1}\times p_2^{2a_2}\times \cdots \times p_k^{2a_k}
となり、示された。

[ \Leftarrow ] X素因数分解X=p_1^{a_1}\times p_2^{a_2}\times \cdots  \times p_k^{a_k}とすると、a_1,a_2 ,..., a_kは偶数なので、
x=p_1^{\frac{a_1}{2}}\times p_2^{\frac{a_2}{2}}\times \cdots  \times p_k^{\frac{a_k}{2}}
を満たす整数xが存在し、先程と同様な議論でx^2=Xとなるため、Xは平方数である。

では、元の命題を証明してみます。

[証明]

[ \Rightarrow ]対偶を示す。
ある素数pについて、i,jに含まれる個数の偶奇が等しくないとする。
偶数個であるものをp^{2n}、奇数個であるものをp^{2m+1}とおく。
i\times jに含まれるpの個数に着目すると、
p^{2n}\times p^{2m+1}=p^{2n+2m+1}=p^{2(n+m)+1}
となり、pは奇数個となる。補題より、i\times jは平方数では無い。よって、対偶が示された。

[ \Leftarrow ]任意の素数pについて、i,jに含まれる個数が共に偶数個である場合、それぞれp^{2n},p^{2m}とすると、i\times jに含まれる個数もp^{2n+2m}=p^{2(n+m)}となり偶数である。共に奇数個である場合p^{2n+1},p^{2m+1}とすると、p^{2n+1+2m+1}=p^{2(n+m+1)}となり偶数となる。よって、偶奇が等しい場合i\times jに含まれる任意の素数の個数は偶数個となり、補題よりi\times jは平方数である。

証明は以上です。
ここまでで、i\times jが平方数となるためには、i,jの素因数の個数の偶奇が等しい必要があることがわかりました。
次に、そのような組の求め方です。

Xの素因数の内、奇数個である素因数の1乗の積f(X)を考えます。
60=2^2\times 3\times 5なら、f(60)=3\times 5
900000=2^5\times 3^2\times 5^5なら、f(900000)=2\times 5
です。

f(X)素数の1乗の積なので、含まれる素数に対して一意に定まることから、素数の偶奇の状態に対しても一意に定まります。
そのため、f(X)=f(Y)ならX,Yの素因数の偶奇の状態が等しいと判断できます。

以上から、以下の解法が導かれます。

  • i=1,...,Nについて、f(i)を求め、同一なf(i)の個数をカウントする
  • f(x)の個数をcnt_{f(x)}とすると、_{cnt_{f(x)}}C_2を全てのf(x)について計算し、総和をとったものが答え

これが公式解説の解法です。(この記事では、f(x)を別物として定義しています。)

f(x)の求め方ですが、公式解説やユーザ解説に色々方法がありますが、こちらのユーザ解説で実装してみました。線形篩を知らなかったので、勉強になりました。
Submission #32343255 - AtCoder Beginner Contest 254