結果
| 問題 |
No.1167 Graduation Trip
|
| ユーザー |
蜜蜂
|
| 提出日時 | 2020-08-11 22:09:26 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 691 ms / 4,000 ms |
| コード長 | 2,152 bytes |
| コンパイル時間 | 2,385 ms |
| コンパイル使用メモリ | 186,172 KB |
| 実行使用メモリ | 29,800 KB |
| 最終ジャッジ日時 | 2024-10-09 11:47:42 |
| 合計ジャッジ時間 | 17,145 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define REP(i, n) for(int i=0;i<(n);++i)
#define int long long
const long long MOD = 1e9+7;
typedef vector<int> INTV;
using BitMatrix = vector<int>;
BitMatrix merge(BitMatrix a, BitMatrix b){
BitMatrix c(a.size() + b.size());
REP(i, a.size()) c[i] = a[i];
REP(i, b.size()) c[a.size()+i] = b[i];
int rank = 0;
for(int col = 31; col >= 0; col--){
int pivot = -1;
for(int row = rank; row < c.size(); row++){
if((c[row] >> col) & 1){
pivot = row; break;
}
}
if(pivot == -1) continue;
swap(c[pivot], c[rank]);
REP(row, c.size()){
if(row != rank and ((c[row] >> col) & 1)) c[row] ^= c[rank];
}
rank++;
}
BitMatrix res(rank);
REP(i, rank) res[i] = c[i];
return res;
}
int siz;
vector<vector<BitMatrix>> table;
vector<int> logtable;
void SparseTable_init(vector<BitMatrix> vec){
siz = vec.size();
logtable.resize(siz+1, 0);
for(int i = 2; i <= siz; i++){
logtable[i] = logtable[i >> 1] + 1;
}
table.resize(siz, vector<BitMatrix>(14));
REP(i, siz){
table[i][0] = vec[i];
}
}
void build(void){
for(int k = 1; (1<<k) <= siz; k++){
for(int i = 0; i + (1<<k) <= siz; i++){
BitMatrix first = table[i][k-1];
BitMatrix second = table[i+(1<<(k-1))][k-1];
table[i][k] = merge(first, second);
}
}
}
BitMatrix query(int l, int r){ // [l, r)
assert(l < r);
int length = r-l;
int k = logtable[length];
return merge(table[l][k], table[r-(1<<k)][k]);
}
int powmod(int a, int p, int m){
int res = 1, tmp = a;
while(p != 0){
if(p % 2)
res = (res*tmp) % m;
tmp = (tmp*tmp) % m;
p /= 2;
}
return res;
}
signed main(){
int N, Q;
cin >> N >> Q;
vector<BitMatrix> vec(N, BitMatrix(1));
REP(i, N) {
int a; cin >> a;
vec[i][0] = a;
}
SparseTable_init(vec);
vector<BitMatrix>().swap(vec);
build();
int M;
REP(_, Q){
cin >> M;
INTV B(M+2); B[0] = 0; B[M+1] = N;
int pw = N;
REP(i, M){
cin >> B[i+1];
}
REP(i, M+1){
pw -= query(B[i], B[i+1]).size();
}
cout << powmod(2ll, pw, MOD) << endl;
}
}
蜜蜂