http://apps.topcoder.com/wiki/display/tc/SRM+518 以下のような関数を考える。 int[] xor_count(int[] a, int[] b, int N) { int[] c = {0} * N; for(int i=0; i {x} N=2 の場合、pre : {x,y} --> {x-y, x+y} xor_count( {x,y}, {u,v} ) = {xu+yv, yu+xv} と {x-y, x+y} * {u-v, u+v} = {xu+yv-xu-xv, xu+yv+yu+xv} から確認できる。 一般にNが2のベキの場合、xorの作用するビットのパターンが再帰的なので pre( [X,Y] ) = [pre(X)-pre(Y), pre(X)+pre(Y)] と再帰的にすれば成り立つ xorでなくて足し算の場合 int[] plus_count(int[] a, int[] b, int N) { int[] c = {0} * 2N; for(int i=0; i