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