AtCoder Beginner Contest 254
コンテスト中AC:A〜C,E
AtCoder Beginner Contest 254 - AtCoder
解けなかったDを解説見てACしたので少しだけ付け足しして書いておきます。
D - Together Square
この問題では、以下の命題が重要そうです。
厳密な証明までは必要なさそうですが、一応理解を深めるため、ここでは証明しておきます。(素人なので、間違っていたらすみません)
まず、以下の補題を証明します。
整数が平方数である任意の素数について、に含まれるの個数が偶数
[証明]
[ ]は平方数であるから、を満たす整数が存在する。の素因数分解をとすると、
となり、示された。
[ ]
の素因数分解をとすると、は偶数なので、
を満たす整数が存在し、先程と同様な議論でとなるため、は平方数である。
では、元の命題を証明してみます。
[証明]
[ ]対偶を示す。
ある素数について、に含まれる個数の偶奇が等しくないとする。
偶数個であるものを、奇数個であるものをとおく。
に含まれるの個数に着目すると、
となり、は奇数個となる。補題より、は平方数では無い。よって、対偶が示された。
[ ]任意の素数について、に含まれる個数が共に偶数個である場合、それぞれとすると、に含まれる個数もとなり偶数である。共に奇数個である場合とすると、となり偶数となる。よって、偶奇が等しい場合に含まれる任意の素数の個数は偶数個となり、補題よりは平方数である。
証明は以上です。
ここまでで、が平方数となるためには、の素因数の個数の偶奇が等しい必要があることがわかりました。
次に、そのような組の求め方です。
の素因数の内、奇数個である素因数の1乗の積を考えます。
なら、
なら、
です。
は素数の1乗の積なので、含まれる素数に対して一意に定まることから、素数の偶奇の状態に対しても一意に定まります。
そのため、ならの素因数の偶奇の状態が等しいと判断できます。
以上から、以下の解法が導かれます。
- について、を求め、同一なの個数をカウントする
- の個数をとすると、を全てのについて計算し、総和をとったものが答え
これが公式解説の解法です。(この記事では、を別物として定義しています。)
の求め方ですが、公式解説やユーザ解説に色々方法がありますが、こちらのユーザ解説で実装してみました。線形篩を知らなかったので、勉強になりました。
Submission #32343255 - AtCoder Beginner Contest 254