結果
| 問題 |
No.1167 Graduation Trip
|
| ユーザー |
FF256grhy
|
| 提出日時 | 2020-08-13 20:14:05 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 6,305 bytes |
| コンパイル時間 | 2,527 ms |
| コンパイル使用メモリ | 211,060 KB |
| 最終ジャッジ日時 | 2025-01-12 22:00:09 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 13 TLE * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using LL = long long int;
#define incID(i, l, r) for(int i = (l) ; i < (r); i++)
#define decID(i, l, r) for(int i = (r) - 1; i >= (l); i--)
#define incII(i, l, r) for(int i = (l) ; i <= (r); i++)
#define decII(i, l, r) for(int i = (r) ; i >= (l); i--)
#define inc(i, n) incID(i, 0, n)
#define dec(i, n) decID(i, 0, n)
#define inc1(i, n) incII(i, 1, n)
#define dec1(i, n) decII(i, 1, n)
#define inID(v, l, r) ((l) <= (v) && (v) < (r))
#define inII(v, l, r) ((l) <= (v) && (v) <= (r))
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define MT make_tuple
#define FI first
#define SE second
#define FR front()
#define BA back()
#define ALL(v) v.begin(), v.end()
#define RALL(v) v.rbegin(), v.rend()
auto setmin = [](auto & a, auto b) { return (b < a ? a = b, true : false); };
auto setmax = [](auto & a, auto b) { return (b > a ? a = b, true : false); };
auto setmineq = [](auto & a, auto b) { return (b <= a ? a = b, true : false); };
auto setmaxeq = [](auto & a, auto b) { return (b >= a ? a = b, true : false); };
#define SI(v) static_cast<int>(v.size())
#define RF(e, v) for(auto & e: v)
#define until(e) while(! (e))
#define if_not(e) if(! (e))
#define ef else if
#define UR assert(false)
// 以下、入出力関係のテンプレ案のテスト
auto * IS = & cin;
// input elements (as a tuple)
template<typename U, int I> void in_(U & t) { }
template<typename U, int I, typename A, typename ... B> void in_(U & t) { (* IS) >> get<I>(t); in_<U, I + 1, B ...>(t); }
template<typename ... T> auto in() { tuple<T ...> t; in_<tuple<T ...>, 0, T ...>(t); return t; }
// input a array
template<typename T, int N> auto ain() { array<T, N> a; inc(i, N) { (* IS) >> a[i]; } return a; }
// input a (multi-dimensional) vector
template<typename T> T vin() { return * istream_iterator<T>(* IS); }
template<typename T, typename N, typename ... M> auto vin(N n, M ... m) {
vector<decltype(vin<T, M ...>(m ...))> v(n); inc(i, n) { v[i] = vin<T, M ...>(m ...); } return v;
}
// input multi-column (as a tuple of vector)
template<typename U, int I> void colin_(U & t) { }
template<typename U, int I, typename A, typename ... B> void colin_(U & t) {
get<I>(t).emplace_back(* istream_iterator<A>(* IS)); colin_<U, I + 1, B ...>(t);
}
template<typename ... T> auto colin(int n) {
tuple<vector<T> ...> t; inc(i, n) { colin_<tuple<vector<T> ...>, 0, T ...>(t); } return t;
}
auto * OS = & cout;
string SP = " ", LN = "\n";
// output elements
void out() { (* OS) << LN << flush; }
template<typename A > void out(A && a ) { (* OS) << a ; out( ); }
template<typename A, typename ... B> void out(A && a, B && ... b) { (* OS) << a << SP; out(b ...); }
// output a (multi-dimensional) vector
template<typename T> ostream & operator<<(ostream & os, vector<T> const & v) {
inc(i, v.size()) { os << (i == 0 ? "" : SP) << v[i]; } return os << flush;
}
template<typename T> void vout_(T && v) { (* OS) << v; }
template<typename T, typename A, typename ... B> void vout_(T && v, A a, B ... b) {
for(auto && w: v) { vout_(w, b ...); (* OS) << a; }
}
template<typename T, typename ... A> void vout(T && v, A ... a) { vout_(v, a ...); out(); }
// ---- ----
template<LL M> class ModInt {
private:
LL v;
pair<LL, LL> ext_gcd(LL a, LL b) {
if(b == 0) { assert(a == 1); return { 1, 0 }; }
auto p = ext_gcd(b, a % b);
return { p.SE, p.FI - (a / b) * p.SE };
}
public:
ModInt(LL vv = 0) { v = vv; if(abs(v) >= M) { v %= M; } if(v < 0) { v += M; } }
LL get_v() { return v; }
ModInt inv() { return ext_gcd(M, v).SE; }
ModInt exp(LL b) {
ModInt p = 1, a = v; if(b < 0) { a = a.inv(); b = -b; }
while(b) { if(b & 1) { p *= a; } a *= a; b >>= 1; }
return p;
}
friend bool operator< (ModInt a, ModInt b) { return (a.v < b.v); }
friend bool operator> (ModInt a, ModInt b) { return (a.v > b.v); }
friend bool operator<=(ModInt a, ModInt b) { return (a.v <= b.v); }
friend bool operator>=(ModInt a, ModInt b) { return (a.v >= b.v); }
friend bool operator==(ModInt a, ModInt b) { return (a.v == b.v); }
friend bool operator!=(ModInt a, ModInt b) { return (a.v != b.v); }
friend ModInt operator+ (ModInt a ) { return ModInt(+a.v); }
friend ModInt operator- (ModInt a ) { return ModInt(-a.v); }
friend ModInt operator+ (ModInt a, ModInt b) { return ModInt(a.v + b.v); }
friend ModInt operator- (ModInt a, ModInt b) { return ModInt(a.v - b.v); }
friend ModInt operator* (ModInt a, ModInt b) { return ModInt(a.v * b.v); }
friend ModInt operator/ (ModInt a, ModInt b) { return a * b.inv(); }
friend ModInt operator^ (ModInt a, LL b) { return a.exp(b); }
friend ModInt & operator+=(ModInt & a, ModInt b) { return (a = a + b); }
friend ModInt & operator-=(ModInt & a, ModInt b) { return (a = a - b); }
friend ModInt & operator*=(ModInt & a, ModInt b) { return (a = a * b); }
friend ModInt & operator/=(ModInt & a, ModInt b) { return (a = a / b); }
friend ModInt & operator^=(ModInt & a, LL b) { return (a = a ^ b); }
friend istream & operator>>(istream & s, ModInt & b) { s >> b.v; b = ModInt(b.v); return s; }
friend ostream & operator<<(ostream & s, ModInt b) { return (s << b.v); }
};
// ----
using MI = ModInt<1'000'000'007>;
template<typename T> T MV(T v) { return v; }
template<typename T, typename ... U> auto MV(T v, int a, U ... b) { return vector<decltype(MV(v, b ...))>(a, MV(v, b ...)); }
#define bit(b, i) (((b) >> (i)) & 1)
#define PC __builtin_popcountll
#define BL(a) (a ? 64 - __builtin_clzll(a) : 0)
const int B = 32;
int main() {
auto [n, Q] = in<int, int>();
auto a = vin<LL>(n);
auto zero = MV<int>(0, n, n + 1);
auto f = [&](vector<LL> a, int l) {
int c = 0;
map<int, LL, greater<int>> mp;
incID(r, l, n) {
for(auto [k, v]: mp) {
if(bit(a[r], k) == 1) { a[r] ^= v; }
}
if(a[r] == 0) { c++; } else { mp[BL(a[r]) - 1] = a[r]; }
zero[l][r + 1] = c;
}
};
inc(i, n) { f(a, i); }
inc(q, Q) {
auto [m] = in<int>();
vector<int> b(m + 2);
inc1(i, m) { cin >> b[i]; }
b[m + 1] = n;
MI ans = 1;
inc(i, m + 1) { ans *= MI(2) ^ zero[b[i]][b[i + 1]]; }
out(ans);
}
}
FF256grhy