結果

問題 No.737 PopCount
ユーザー ooaiu
提出日時 2025-10-04 00:57:49
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 2 ms / 1,000 ms
コード長 1,053 bytes
コンパイル時間 3,577 ms
コンパイル使用メモリ 281,572 KB
実行使用メモリ 7,716 KB
最終ジャッジ日時 2025-10-04 00:57:54
合計ジャッジ時間 4,961 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using mint = atcoder::modint1000000007;
using ll = long long;
mint dp[65][65][2];
mint ep[65][65][2];
int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    ll N;
    cin >> N;
    string S = "";
    do {
        S += (N % 2) + '0';
        N /= 2;
    } while (N);
    reverse(S.begin(), S.end());

    N = S.size();
    dp[0][0][0] = 1;
    const int maxn = 62;
    for (int i = 0; i < N; i++) {
        for (int c1 = 0; c1 < maxn; c1++) {
            for (int l = 0; l < 2; l++) {
                int lim = l ? 1 : S[i] - '0';
                for (int d = 0; d <= lim; d++) {
                    auto& t = dp[i + 1][c1 + (d == 1)][l || d < lim];
                    t += dp[i][c1][l];
                    ep[i + 1][c1 + (d == 1)][l || d < lim] += ep[i][c1][l] * 2 + t * d;
                }
            }
        }
    }
    mint ans = 0;
    for (int i = 0; i < maxn; i++) ans += (ep[N][i][0] + ep[N][i][1]) * i;
    cout << ans.val() << "\n";
}
0