1~2014 までの数を 2 進数で表したときに,連続する 2 数の 1 の個数が同じであるようなペアは何組存在するか
連続する数のうち,(1, 2),(5, 6), (9, 10), ...
のように, (4(i-1)+1, 4(i-1)+2),i = 1, 2, ... の 2 数の 1 の個数が等しくなる。
よって,n までには ifelse( (n-1)%%4, (n-1)%/%4+1, (n-1)%/%4) 組存在する
n = 2014 ならば,
> n = 2014
> ifelse( (n-1)%%4, (n-1)%/%4+1, (n-1)%/%4)
[1] 504
504 組存在する
愚直なプログラムを書いて確かめるなら,
> func = function(n) {
+ count = 0
+ repeat {
+ count = count + n %% 2
+ n = n %/% 2
+ if (n == 0) return(count)
+ }
+ }
> sum(diff(sapply(1:n, func)) == 0)
[1] 504