怠惰の累積和

技術/競プロ/怪文書/虚無

AtCoder Beginner Contest 129 E - Sum Equals Xor

問題概要

 正整数Lに対し、a+b≦La+b=a xor bとなる(a,b)は何組存在するか。

atcoder.jp

 

解法

 Lを上の桁から見て行って、n桁目でLよりも大きくなるとする(これはn桁目が'1'であることと一致する)。すると、それまでに出てきた'1'の個数をpとすると、pについて、a,bの中に'1'という文字はp個含まれる。よって、a,bx桁目(n≦x≦L.length())において考えられる(a,b)の桁の組み合わせは(1,0),(0,1)の2通りの為、上n桁目までで考えられる整数の通り数は2^p通り。

 反対に、n桁目以降についてはどのように配置しても条件を満たすため、(0,0),(0,1),(1,0)の3通りが配置として考えられるため、q=L.length()-pとすると、3^q通りがあり得る。

 

 纏めると、n桁目(n桁目は'1')において、考えられる整数は2^p+3^q通り。

 よって、Lを前から見て行き、'1'という文字が出てくるたびに答えとなる変数に上記の数値を足していけばよい。これを実装して、AC。

atcoder.jp