結果
| 問題 | No.3431 popcount & sum (Easy) |
| コンテスト | |
| ユーザー |
pengin_2000
|
| 提出日時 | 2026-01-11 16:06:04 |
| 言語 | C (gcc 15.2.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 4,914 bytes |
| 記録 | |
| コンパイル時間 | 1,679 ms |
| コンパイル使用メモリ | 44,868 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-11 16:06:07 |
| 合計ジャッジ時間 | 1,177 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 9 |
ソースコード
#include<stdio.h>
long long int dp[100][2][2][200], cnt[100][2][2][200];
int main()
{
long long int n;
scanf("%lld", &n);
const long long int p = 998244353;
long long int i, j, k, l;
for (i = 0; i < 100; i++)
for (j = 0; j < 2; j++)
for (k = 0; k < 2; k++)
for (l = 0; l < 200; l++)
dp[i][j][k][l] = 0;
cnt[62][0][0][100] = 1;
for (l = 61; l >= 0; l--)
{
if (((n >> l) & 1) > 0)
{
//dp[l+1][0][0][100]
//1,1
cnt[l][0][0][100] = 1;
dp[l][0][0][100] += (dp[l + 1][0][0][100] + ((long long int)(1) << l)) % p;
dp[l][0][0][100] %= p;
//1,0
cnt[l][0][1][101]++;
cnt[l][0][1][101] %= p;
dp[l][0][1][101] += dp[l + 1][0][0][100];
dp[l][0][1][101] %= p;
//0,0
cnt[l][1][0][100]++;
cnt[l][1][0][100] %= p;
dp[l][1][0][100] += dp[l + 1][0][0][100];
dp[l][1][0][100] %= p;
//dp[l+1][0][1][i]
for (i = 1; i < 199; i++)
{
//1,1
cnt[l][0][1][i] += cnt[l + 1][0][1][i];
cnt[l][0][1][i] %= p;
dp[l][0][1][i] += (dp[l + 1][0][1][i] + ((long long int)(1) << l) % p * cnt[l + 1][0][1][i]) % p;
dp[l][0][1][i] %= p;
//1,0
cnt[l][0][1][i + 1] += cnt[l + 1][0][1][i];
cnt[l][0][1][i + 1] %= p;
dp[l][0][1][i + 1] += dp[l + 1][0][1][i];
dp[l][0][1][i + 1] %= p;
//0,1
cnt[l][1][1][i-1] += cnt[l + 1][0][1][i];
cnt[l][1][1][i-1] %= p;
dp[l][1][1][i - 1] += dp[l + 1][0][1][i];
dp[l][1][1][i-1] %= p;
//0,0
cnt[l][1][1][i] += cnt[l + 1][0][1][i];
cnt[l][1][1][i] %= p;
dp[l][1][1][i] += dp[l + 1][0][1][i];
dp[l][1][1][i] %= p;
}
//dp[l+1][1][0][i]
for (i = 1; i < 199; i++)
{
//1,1
cnt[l][1][0][i] += cnt[l + 1][1][0][i];
cnt[l][1][0][i] %= p;
dp[l][1][0][i] += (dp[l + 1][1][0][i] + ((long long int)(1) << l) % p * cnt[l + 1][1][0][i]) % p;
dp[l][1][0][i] %= p;
//1,0
cnt[l][1][1][i + 1] += cnt[l + 1][1][0][i];
cnt[l][1][1][i + 1] %= p;
dp[l][1][1][i + 1] += dp[l + 1][1][0][i];
dp[l][1][1][i + 1] %= p;
//0,0
cnt[l][1][0][i] += cnt[l + 1][1][0][i];
cnt[l][1][0][i] %= p;
dp[l][1][0][i] += dp[l + 1][1][0][i];
dp[l][1][0][i] %= p;
}
//dp[l+1][1][1][i]
for (i = 1; i < 199; i++)
{
//1,1
cnt[l][1][1][i] += cnt[l + 1][1][1][i];
cnt[l][1][1][i] %= p;
dp[l][1][1][i] += (dp[l + 1][1][1][i] + ((long long int)(1) << l) % p * cnt[l + 1][1][1][i]) % p;
dp[l][1][1][i] %= p;
//1,0
cnt[l][1][1][i+1] += cnt[l + 1][1][1][i];
cnt[l][1][1][i+1] %= p;
dp[l][1][1][i + 1] += dp[l + 1][1][1][i];
dp[l][1][1][i+1] %= p;
//0,1
cnt[l][1][1][i - 1] += cnt[l + 1][1][1][i];
cnt[l][1][1][i - 1] %= p;
dp[l][1][1][i - 1] += dp[l + 1][1][1][i];
dp[l][1][1][i - 1] %= p;
//0,0
cnt[l][1][1][i] += cnt[l + 1][1][1][i];
cnt[l][1][1][i] %= p;
dp[l][1][1][i] += dp[l + 1][1][1][i];
dp[l][1][1][i] %= p;
}
}
else
{
//dp[l+1][0][0][100]
//0,0
cnt[l][0][0][100]++;
cnt[l][0][0][100] %= p;
dp[l][0][0][100] += dp[l + 1][0][0][100];
dp[l][0][0][100] %= p;
//dp[l+1][0][1][i]
for (i = 1; i < 199; i++)
{
//0,1
cnt[l][0][1][i - 1] += cnt[l + 1][0][1][i];
cnt[l][0][1][i - 1] %= p;
dp[l][0][1][i - 1] += dp[l + 1][0][1][i];
dp[l][0][1][i - 1] %= p;
//0,0
cnt[l][0][1][i] += cnt[l + 1][0][1][i];
cnt[l][0][1][i] %= p;
dp[l][0][1][i] += dp[l + 1][0][1][i];
dp[l][0][1][i] %= p;
}
//dp[l+1][1][0][i]
for (i = 1; i < 199; i++)
{
//1,1
cnt[l][1][0][i] += cnt[l + 1][1][0][i];
cnt[l][1][0][i] %= p;
dp[l][1][0][i] += (dp[l + 1][1][0][i] + ((long long int)(1) << l) % p * cnt[l + 1][1][0][i]) % p;
dp[l][1][0][i] %= p;
//1,0
cnt[l][1][1][i + 1] += cnt[l + 1][1][0][i];
cnt[l][1][1][i + 1] %= p;
dp[l][1][1][i + 1] += dp[l + 1][1][0][i];
dp[l][1][1][i + 1] %= p;
//0,0
cnt[l][1][0][i] += cnt[l + 1][1][0][i];
cnt[l][1][0][i] %= p;
dp[l][1][0][i] += dp[l + 1][1][0][i];
dp[l][1][0][i] %= p;
}
//dp[l+1][1][1][i]
for (i = 1; i < 199; i++)
{
//1,1
cnt[l][1][1][i] += cnt[l + 1][1][1][i];
cnt[l][1][1][i] %= p;
dp[l][1][1][i] += (dp[l + 1][1][1][i] + ((long long int)(1) << l) % p * cnt[l + 1][1][1][i]) % p;
dp[l][1][1][i] %= p;
//1,0
cnt[l][1][1][i + 1] += cnt[l + 1][1][1][i];
cnt[l][1][1][i + 1] %= p;
dp[l][1][1][i + 1] += dp[l + 1][1][1][i];
dp[l][1][1][i + 1] %= p;
//0,1
cnt[l][1][1][i - 1] += cnt[l + 1][1][1][i];
cnt[l][1][1][i - 1] %= p;
dp[l][1][1][i - 1] += dp[l + 1][1][1][i];
dp[l][1][1][i - 1] %= p;
//0,0
cnt[l][1][1][i] += cnt[l + 1][1][1][i];
cnt[l][1][1][i] %= p;
dp[l][1][1][i] += dp[l + 1][1][1][i];
dp[l][1][1][i] %= p;
}
}
}
long long int ans = 0;
l = 0;
k = 100;
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
ans = (ans + dp[l][i][j][k]) % p;
printf("%lld\n", ans);
return 0;
}
pengin_2000