SRM416

250

2進数Nが与えられた時にNと1のビットの数の個数が等しいNより大きい最小の数を返せという問題。
数字を配列に直してnextPermutationするだけ。

500

要約すると与えられた数M(<=6,000,000)に対して、M以下の数を互いに異なる6つの正の数で表す方法は何通りあるか答えよという問題。
今6つの数を
(a, a+d_1, a+d_1+d_2, a+d_1+d_2+d_3, a+d_1+d_2+d_3+d_4, a+d_1+d_2+d_3+d_4+d_5) , d_i > 0
とおく、このとき総和は
 s = 6 a + 5 d_1 + 4 d_2 + 3 d_3 + 2 d_4 + d_5
となり、
 k = 5 d_1 + 4 d_2 + 3 d_3 + 2 d_4 + d_5
とおくと、s <= Mとなる場合の数は((M-k)/6)*(kを表す方法の数)通りある。(kを表す方法の数)をO(5 * M)のDPで求めればよい。