結果
| 問題 | No.3594 Subset OR |
| ユーザー |
|
| 提出日時 | 2026-07-24 21:14:28 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 607 ms / 3,000 ms |
| + 313µs | |
| コード長 | 932 bytes |
| 記録 | |
| コンパイル時間 | 403 ms |
| コンパイル使用メモリ | 81,792 KB |
| 実行使用メモリ | 134,784 KB |
| 最終ジャッジ日時 | 2026-07-24 21:14:56 |
| 合計ジャッジ時間 | 26,768 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
#include <iostream>
#include <array>
using u64 = unsigned long long;
using u32 = unsigned;
using bs_t = std::array<u64, 1<<(30-6)>;
bs_t B;
void set(bs_t &B, u32 i){
B[i/64] |= 1ULL << (i%64);
}
void zeta(bs_t &B){
for(u32 i = 1; i < B.size(); i <<= 1){
for(u32 j = 0; j < B.size(); j++){
if(j & i){
B[j - i] |= B[j];
}
}
}
for(u32 j = 0; j < B.size(); j++){
B[j] |= B[j] >> 32;
B[j] |= (B[j] >> 16) & 0x0000FFFF0000FFFF;
B[j] |= (B[j] >> 8) & 0x00FF00FF00FF00FF;
B[j] |= (B[j] >> 4) & 0x0F0F0F0F0F0F0F0F;
B[j] |= (B[j] >> 2) & 0x3333333333333333;
B[j] |= (B[j] >> 1) & 0x5555555555555555;
}
}
int main(){
u32 n;
std::cin >> n;
for(u32 i = 0; i < n; i++){
u32 a;
std::cin >> a;
set(B, a);
}
zeta(B);
u64 ans = 0;
for(u32 i = 0; i < B.size(); i++){
ans += __builtin_popcountll(B[i]);
}
std::cout << ans << std::endl;
return 0;
}