方針
プログラムの各行を数式に直し、 が奇数だけを動くこと、50行目の が を で割った余りであることを読む。したがって出力は の正の奇数約数の和である。(3)では奇数約数の和が奇数になる条件を、奇数部分が平方数であることに言い換えて列挙する。
解答
(1)
30行目で としているので、40行目から80行目のループでは という奇数だけを調べる。50行目の は、 を で割った余りである。したがって、70行目で加えられるのは を割り切る奇数 だけである。 の正の奇数約数はであるから、出力は である。
(2)
出力が1となるのは、正の奇数約数が1しかないときである。これは が奇数の素因数をもたないことと同値である。したがって の形の自然数がすべて求める入力である。
(3) と書く。ただし は奇数とする。プログラムの出力は の正の約数の和である。 を と素因数分解すると、約数の和はである。各 は奇数なので、 の偶奇は項数 の偶奇で決まる。よって約数の和が奇数であるための条件は、すべての が偶数、すなわち が平方数であることである。
出力が1より大きい奇数になるには、 が1より大きい奇数平方数であればよい。 の範囲で、奇数平方数としてあり得る はである。これらに2のべき乗を掛けて50以下に収めると を得る。したがって求める自然数は である。
別解
解法2
方針
プログラムを奇数 の走査と読み、出力を の奇数約数の和と解釈する。約数を と に組にする方法で、奇数約数の和が奇数となる条件を奇数部分が平方数であることへ直す。
解答
(1)
40行目では を走査し、50行目のは を で割った余りである。したがって出力は の正の奇数約数の和である。 の奇数約数は なので、出力は4である。
(2)
出力が1なら、奇数約数は1しかない。これは が2のべきであることと同値である。したがってである。
(3)
とし、 を奇数とする。出力は の全約数の和である。約数を と に組にすると、異なる2数の組の和は偶数である。組にならない約数があるのは 、すなわち が平方数のときだけであり、その中央の約数は奇数である。よって出力が奇数であることと が平方数であることは同値である。
で、 の奇数平方数は である。2のべき倍を50以下まで並べるとしたがって答えはである。
総評
プログラム問題だが、実質は「奇数約数の和」を読む整数問題で、想定時間は25分程度。50行目が余りを計算していること、60行目と70行目が割り切れるときだけ加算することを正確に翻訳できれば大半は解ける。(3)は単なる列挙ではなく、約数和が奇数になる条件を平方数条件にするのが重要で、 から2の倍数を作ると漏れが出にくい。