結果
| 問題 | No.3431 popcount & sum (Easy) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-11 15:04:02 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 824 ms / 2,000 ms |
| コード長 | 1,059 bytes |
| 記録 | |
| コンパイル時間 | 3,407 ms |
| コンパイル使用メモリ | 346,384 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-11 15:04:38 |
| 合計ジャッジ時間 | 11,998 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 9 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
#include <atcoder/modint>
using mint=atcoder::modint998244353;
int main(){
ll n;
cin>>n;
mint ans=0;
for(int c=0;c<60;c++){
vector<vector<mint>> dp(120,vector<mint>(120)),ndp(120,vector<mint>(120));
dp[60][60]=1;
for(int i=59;i>=0;i--){
for(int j=0;j<120;j++)for(int k=0;k<120;k++){
for(int x=0;x<2;x++)for(int y=0;y<2;y++){
if(i==c){
if(x==0||y==0)continue;
}
int nj=j,nk=k;
if(j>=60){
if(n>>i&1){
if(x==0)nj-=60;
}else{
if(x==1)continue;
}
}
if(k>=60){
if(n>>i&1){
if(y==0)nk-=60;
}else{
if(y==1)continue;
}
}
if(x==1)nj++;
if(y==1)nk++;
if(nj<120&&nk<120)ndp[nj][nk]+=dp[j][k];
}
}
swap(dp,ndp);
for(int j=0;j<120;j++)ndp[j].assign(120,0);
}
mint res=0;
for(int i=0;i<60;i++)res+=(1ll<<c)*(dp[i][i]+dp[i][i+60]+dp[i+60][i]+dp[i+60][i+60]);
ans+=res;
}
mint t=n;
t=(t*(t+1))/2;
ans=(ans-t)/2+t;
cout<<ans.val()<<endl;
}