結果
| 問題 |
No.803 Very Limited Xor Subset
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-03-17 23:10:21 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 7 ms / 2,000 ms |
| コード長 | 1,673 bytes |
| コンパイル時間 | 2,153 ms |
| コンパイル使用メモリ | 195,584 KB |
| 最終ジャッジ日時 | 2025-01-06 23:15:27 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 43 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const int64_t MOD = 1e9+7;
int nth_bit(int64_t num, int n){
return (num >> n) & 1;
}
void fail(){
cout << 0 << endl;
exit(0);
}
int main(){
int N, M, X;
cin >> N >> M >> X;
static int A[300][330];
for(int i=0; i<N; i++){
int a;
cin >> a;
for(int k=0; k<30; k++) A[i][M+k] = nth_bit(a, k);
}
int C[330];
for(int k=0; k<30; k++) C[M+k] = nth_bit(X, k);
for(int j=0; j<M; j++){
int t, l, r;
cin >> t >> l >> r;
l--; r--;
C[j] = t;
for(int i=l; i<=r; i++) A[i][j] = 1;
}
int M2 = M+30;
int rank = 0;
int row[330];
for(int j=0; j<M2; j++) row[j] = -1;
for(int j=0; j<M2; j++){
int pivot = -1;
for(int i=rank; i<N; i++){
if(A[i][j]){
pivot = i;
break;
}
}
if(pivot >= 0){
row[j] = rank;
if(pivot != rank) for(int k=0; k<M2; k++) swap(A[pivot][k], A[rank][k]);
for(int i=0; i<N; i++){
if(i != rank && A[i][j]) for(int k=0; k<M2; k++) A[i][k] ^= A[rank][k];
}
rank++;
}
}
int C2[330] = {0};
for(int j=0; j<M2; j++){
if(C[j]){
if(row[j] >= 0) for(int k=0; k<M2; k++) C2[k] ^= A[row[j]][k];
}
}
for(int j=0; j<M2; j++){
if(C2[j] != C[j]) fail();
}
int64_t ans = 1;
for(int i=0; i<N; i++){
bool zero = true;
for(int j=0; j<M2; j++) if(A[i][j]) zero = false;
if(zero) ans = ans * 2 % MOD;
}
cout << ans << endl;
return 0;
}