💎
ABC190 D - Staircase Sequences の解説 [Ruby]
問題へのリンク
問題概要
整数からなる公差
制約
1\leq N \leq 10^{12} -
は整数N
解法
長さが奇数の数列の総和は、「中心の数」×「数列の長さ」で計算できる。
長さが偶数の数列の総和は、「中心の2数の和」×「数列の長さ÷2」で計算できる。
これらから、整数からなる公差
逆に、
「奇数」×「奇数」の場合は、「長さが奇数の数列」と「長さが偶数の数列」の両方が復元できる。
「奇数」×「偶数」の場合は、「長さが偶数の数列」が復元できる。
「偶数」×「奇数」の場合は、「長さが奇数の数列」が復元できる。
「偶数」×「偶数」の場合は、数列が復元できない。
復元できる数列の数をまとめると以下のとおり。
掛けられる数 | 掛ける数 | 数列の数 |
---|---|---|
奇数 | 奇数 | 2 |
奇数 | 偶数 | 1 |
偶数 | 奇数 | 1 |
偶数 | 偶数 | 0 |
なんとこれは掛け算に含まれる奇数の数に一致している!
すべての掛け算を列挙してみると、
(例)
(例)
コード
require "prime"
# 約数を列挙した数列を返す関数
def divisor_enumeration(n)
n.prime_division.inject([1]) do |ary, (p, e)|
(0..e).map{ |e1| p ** e1 }.product(ary).map{ |a, b| a * b }
end.sort
end
n = gets.to_i
# 約数のうち奇数であるものの数を2倍して出力
puts divisor_enumeration(n).count{|x| x.odd?} * 2
コードへのリンク
Discussion