結果
| 問題 | No.3432 popcount & sum (Hard) |
| コンテスト | |
| ユーザー |
y_1
|
| 提出日時 | 2026-01-11 14:04:16 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 17 ms / 2,000 ms |
| コード長 | 1,762 bytes |
| 記録 | |
| コンパイル時間 | 3,667 ms |
| コンパイル使用メモリ | 350,704 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-11 14:04:39 |
| 合計ジャッジ時間 | 4,266 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#include <atcoder/modint>
using namespace atcoder;
using mint = modint998244353;
int done_build_fact = 0;
vector<mint> fac;
vector<mint> inv;
// 998244353
void build_fact(int N){
fac.resize(N+1);
inv.resize(N+1);
fac[0] = 1;
for(int i = 1; i <= N; i++)fac[i] = fac[i-1] * i;
inv[N] = fac[N].pow(998244353-2);
for(int i = N-1; i >= 0; --i)inv[i] = inv[i+1] * (i+1);
done_build_fact = N;
}
mint binom(int n , int k){
if(n < k)return 0;
assert(done_build_fact >= n);
return fac[n] * inv[k] * inv[n-k];
}
// Don't forget calling build_fact
int main() {
ll n; cin >> n;
mint ans = 0;
vector<int> d;
ll m = n;
for(int i = 0; i < 60; i++){
d.push_back(m%2);
m /= 2;
}
reverse(d.begin(), d.end());
for(int i = 0; i < 60; i++){
vector<vector<vector<mint>>> dp(61, vector<vector<mint>>(60, vector<mint>(2)));
dp[0][0][0] = 1;
for(int j = 0; j < 60; j++){
for(int k = 0; k < 59; k++){
for(int l = 0; l < 2; l++){
for(int nxt = 0; nxt <= 1; nxt++){
if(j == i && nxt == 0)continue;
int nj = j + 1;
int nk = k + nxt;
int nl = l;
if(d[j] < nxt && l == 0)continue;
if(d[j] > nxt)nl = 1;
dp[nj][nk][nl] += dp[j][k][l];
}
}
}
}
for(int j = 0; j < 60; j++){
mint tmp = dp[60][j][0] + dp[60][j][1];
ans += (1LL<<(59-i)) * (tmp * (tmp - 1) / 2 + tmp);
}
}
cout << ans.val() << endl;
}
y_1