コンテスト中に解けませんでした。
解法
小さいに対して実験してOEISで検索します。
2,4,5,8,10,13,14,18,21,26,28,33,36,40,41 - OEIS
A007729が答えになりそうですが、残念ながらいい感じに求める式は見つかりません。
しかし、この数列はA002487の部分和で表されることが分かります。
A002487の一般項は次にように表せます。
これの部分和を頑張って式変形します。
のとき、
であることを用いて、
これであとはメモ化再帰でを出力すると解けます。
ソースコード
import java.util.HashMap; import java.util.Scanner; public class Main { public static long MOD = 1000000007; public static void main(String[] args) { Scanner sc = new Scanner(System.in); long n = sc.nextLong(); System.out.println(f(n+1)); } static HashMap<Long, Long> hm = new HashMap<>(); public static long f(long n) { Long memo = hm.get(n); if (memo != null) return memo; if (n <= 2) { return n; } long res = f(n/2) + f((n-1)/2) + f((n+1)/2); res %= MOD; hm.put(n, res); return res; } }