結果
問題 | No.2134 $\sigma$-algebra over Finite Set |
ユーザー | hari64 |
提出日時 | 2022-11-25 22:56:21 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 87 ms / 2,000 ms |
コード長 | 15,409 bytes |
コンパイル時間 | 2,829 ms |
コンパイル使用メモリ | 234,324 KB |
実行使用メモリ | 7,168 KB |
最終ジャッジ日時 | 2024-10-07 07:40:47 |
合計ジャッジ時間 | 3,990 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 86 ms
7,040 KB |
testcase_02 | AC | 87 ms
7,168 KB |
testcase_03 | AC | 2 ms
6,820 KB |
testcase_04 | AC | 4 ms
6,820 KB |
testcase_05 | AC | 2 ms
6,816 KB |
testcase_06 | AC | 6 ms
6,816 KB |
testcase_07 | AC | 6 ms
6,816 KB |
testcase_08 | AC | 2 ms
6,820 KB |
testcase_09 | AC | 2 ms
6,820 KB |
testcase_10 | AC | 11 ms
7,168 KB |
testcase_11 | AC | 11 ms
7,168 KB |
testcase_12 | AC | 22 ms
7,168 KB |
testcase_13 | AC | 49 ms
7,040 KB |
testcase_14 | AC | 5 ms
6,820 KB |
testcase_15 | AC | 7 ms
6,820 KB |
testcase_16 | AC | 6 ms
6,816 KB |
testcase_17 | AC | 2 ms
6,816 KB |
testcase_18 | AC | 1 ms
6,816 KB |
ソースコード
#include <bits/stdc++.h> // clang-format off using namespace std;constexpr int INF=1001001001;constexpr long long INFll=1001001001001001001;namespace viewer{using s=string;template<class T>s f(T i){s S=i==INF||i==INFll?"inf":to_string(i);return s(max(0,3-int(S.size())),' ')+S;} template<class T>auto v(T&x,s&&e)->decltype(cerr<<x){return cerr<<x<<e;}void v(int x,s&&e){cerr<<f(x)<<e;}void v(long long x,s&&e){cerr<<f(x)<<e;}void v(float x,s&&e){cerr<<fixed<<setprecision(5)<<x<<e;}void v(double x,s&&e){cerr<<fixed<<setprecision(5)<<x<<e;}void v(long double x,s&&e){cerr<<fixed<<setprecision(5)<<x<<e;} template<class T,class U>void v(const pair<T,U>&p,s&&e="\n"){cerr<<"(";v(p.first,", ");v(p.second,")"+e);}template<class T,class U>void v(const tuple<T,U>&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),")"+e);}template<class T,class U,class V>void v(const tuple<T,U,V>&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),")"+e);}template<class T,class U,class V,class W>void v(const tuple<T,U,V,W>&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),", ");v(get<3>(t),")"+e);} template<class T>void v(const vector<T>&vx,s);template<class T>auto ve(int,const vector<T>&vx)->decltype(cerr<<vx[0]){cerr<<"{";for(const T&x:vx)v(x,",");return cerr<<"}\n";}template<class T>auto ve(bool,const vector<T>&vx){cerr<<"{\n";for(const T&x:vx)cerr<<" ",v(x,",");cerr<<"}\n";}template<class T>void v(const vector<T>&vx,s){ve(0,vx);} template<class T>void v(const deque<T>&q,s&&e){v(vector<T>(q.begin(),q.end()),e);}template<class T,class C>void v(const set<T,C>&S,s&&e){v(vector<T>(S.begin(),S.end()),e);}template<class T,class C>void v(const multiset<T,C>&S,s&&e){v(vector<T>(S.begin(),S.end()),e);}template<class T>void v(const unordered_set<T>&S,s&&e){v(vector<T>(S.begin(),S.end()),e);} template<class T,class U,class V>void v(const priority_queue<T,U,V>&p,s&&e){priority_queue<T,U,V>q=p;vector<T>z;while(!q.empty()){z.push_back(q.top());q.pop();}v(z,e);}template<class T,class U>void v(const map<T,U>&m,s&&e){cerr<<"{"<<(m.empty()?"":"\n");for(const auto&kv:m){cerr<<" [";v(kv.first,"");cerr<<"] : ";v(kv.second,"");cerr<<"\n";}cerr<<"}"+e;} template<class T>void _view(int n,s&S,T&var){cerr<<"\033[1;32m"<<n<<"\033[0m: \033[1;36m"<<S<<"\033[0m = ";v(var,"\n");}template<class T>void grid([[maybe_unused]]T _){}void grid(const vector<vector<bool>>&vvb){cerr<<"\n";for(const vector<bool>&vb:vvb){for(const bool&b:vb)cerr<<(b?".":"#");cerr<<"\n";}} void _debug(int,s){}template<typename H,typename... T>void _debug(int n,s S,const H&h,const T&... t){int i=0,cnt=0;for(;i<int(S.size());i++){if(S[i]=='(')cnt++;if(S[i]==')')cnt--;if(cnt==0&&S[i]==',')break;}if(i==int(S.size()))_view(n,S,h);else{s S1=S.substr(0,i),S2=S.substr(i+2);if(S2=="\"grid\""){cerr<<"\033[1;32m"<<n<<"\033[0m: \033[1;36m"<<S1<<"\033[0m = ";grid(h);}else _view(n,S1,h),_debug(n,S2,t...);}}} template<class T>bool chmax(T&a,const T&b){return a<b?a=b,1:0;}template<class T>bool chmin(T&a,const T&b){return a>b?a=b,1:0;} // https://rsk0315.hatenablog.com/entry/2021/01/18/065720 namespace internal{template<class T>using is_signed_int128=typename conditional<is_same<T,__int128_t>::value||is_same<T,__int128>::value,true_type,false_type>::type;template<class T>using is_unsigned_int128=typename conditional<is_same<T,__uint128_t>::value||is_same<T,unsigned __int128>::value,true_type,false_type>::type;template<class T>using is_integral=typename conditional<std::is_integral<T>::value||is_signed_int128<T>::value||is_unsigned_int128<T>::value,true_type,false_type>::type; template<class T>using is_signed_int=typename conditional<(is_integral<T>::value&&is_signed<T>::value)||is_signed_int128<T>::value,true_type,false_type>::type;template<class T>using is_unsigned_int=typename conditional<(is_integral<T>::value&&is_unsigned<T>::value)||is_unsigned_int128<T>::value,true_type,false_type>::type;template<class T>using is_signed_int_t=enable_if_t<is_signed_int<T>::value>;template<class T>using is_unsigned_int_t=enable_if_t<is_unsigned_int<T>::value>; constexpr long long safe_mod(long long x,long long m){x%=m;if(x<0)x+=m;return x;}struct barrett{unsigned int _m;unsigned long long im;explicit barrett(unsigned int m):_m(m),im((unsigned long long)(-1)/m+1){}unsigned int umod()const{return _m;}unsigned int mul(unsigned int a,unsigned int b)const{unsigned long long z=a;z*=b;unsigned long long x=(unsigned long long)(((unsigned __int128)(z)*im)>>64);unsigned int v=(unsigned int)(z-x*_m);if(_m<=v)v+=_m;return v;}}; constexpr long long pow_mod_constexpr(long long x,long long n,int m){if(m==1)return 0;unsigned int _m=(unsigned int)(m);unsigned long long r=1;unsigned long long y=safe_mod(x,m);while(n){if(n&1)r=(r*y)%_m;y=(y*y)%_m;n>>=1;}return r;}constexpr pair<long long,long long>inv_gcd(long long a,long long b){a=safe_mod(a,b);if(a==0)return{b,0};long long s=b,t=a;long long m0=0,m1=1;while(t){long long u=s/t;s-=t*u;m0-=m1*u;auto tmp=s;s=t;t=tmp;tmp=m0;m0=m1;m1=tmp;}if(m0<0)m0+=b/s;return{s,m0};} constexpr bool is_prime_constexpr(int n){if(n<=1)return false;if(n==2||n==7||n==61)return true;if(n%2==0)return false;long long d=n-1;while(d%2==0)d/=2;constexpr long long bases[3]={2,7,61};for(long long a:bases){long long t=d;long long y=pow_mod_constexpr(a,t,n);while(t!=n-1&&y!=1&&y!=n-1){y=y*y%n;t<<=1;}if(y!=n-1&&t%2==0)return false;}return true;}template<int n>constexpr bool is_prime=is_prime_constexpr(n);} // namespace internal template<int m>struct static_modint{using mint=static_modint;static constexpr int mod(){return m;}static mint raw(int v){mint x;x._v=v;return x;}static_modint():_v(0){}template<class T,internal::is_signed_int_t<T>* =nullptr>static_modint(T v){long long x=(long long)(v%(long long)(umod()));if(x<0)x+=umod();_v=(unsigned int)(x);}template<class T,internal::is_unsigned_int_t<T>* =nullptr>static_modint(T v){_v=(unsigned int)(v%umod());}unsigned int val()const{return _v;} mint&operator++(){_v++;if(_v==umod())_v=0;return*this;}mint&operator--(){if(_v==0)_v=umod();_v--;return*this;}mint operator++(int){mint result=*this;++*this;return result;}mint operator--(int){mint result=*this;--*this;return result;}mint&operator+=(const mint&rhs){_v+=rhs._v;if(_v>=umod())_v-=umod();return*this;}mint&operator-=(const mint&rhs){_v-=rhs._v;if(_v>=umod())_v+=umod();return*this;} mint&operator*=(const mint&rhs){unsigned long long z=_v;z*=rhs._v;_v=(unsigned int)(z%umod());return*this;}mint&operator/=(const mint&rhs){return*this=*this*rhs.inv();}mint operator+()const{return*this;}mint operator-()const{return mint()-*this;}mint pow(long long n)const{assert(0<=n);mint x=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}return r;}mint inv()const{if(prime){assert(_v);return pow(umod()-2);}else{auto eg=internal::inv_gcd(_v,m);assert(eg.first==1);return eg.second;}} friend mint operator+(const mint&lhs,const mint&rhs){return mint(lhs)+=rhs;}friend mint operator-(const mint&lhs,const mint&rhs){return mint(lhs)-=rhs;}friend mint operator*(const mint&lhs,const mint&rhs){return mint(lhs)*=rhs;}friend mint operator/(const mint&lhs,const mint&rhs){return mint(lhs)/=rhs;}friend bool operator==(const mint&lhs,const mint&rhs){return lhs._v==rhs._v;}friend bool operator!=(const mint&lhs,const mint&rhs){return lhs._v!=rhs._v;} friend ostream&operator<<(ostream&os,const mint&rhs){return os<<rhs._v;}friend istream&operator>>(istream&is,mint&rhs){long long v;is>>v;v%=(long long)(umod());if(v<0)v+=umod();;rhs._v=(unsigned int)v;return is;}static constexpr bool prime=internal::is_prime<m>;private:unsigned int _v;static constexpr unsigned int umod(){return m;}}; constexpr int MOD = 998244353;using mint=static_modint<MOD>;vector<mint>mint_factorial={mint(1)};/*n>1e8 ⇒ fast_modfact(deprecated)*/mint modfact(int n){assert(n<=100000000);if(int(mint_factorial.size())<=n){for(int i=mint_factorial.size();i<=n;i++){mint next=mint_factorial.back()*i;mint_factorial.push_back(next);}}return mint_factorial[n];} /*x s.t. x^2 ≡ a (mod Prime) or -1*/mint modsqrt(mint a){long long p=mint::mod();if(a.val()==1)return a;if(a.pow((p-1)>>1).val()!=1)return -1;mint b=1,one=1;while(b.pow((p-1)>>1).val()==1)b+=one;long long m=p-1,e=0;while(m%2==0)m>>=1,e++;mint x=a.pow((m-1)>>1);mint y=a*x*x;x*=a;mint z=b.pow(m);while(y!=1){long long j=0;mint t=y;while(t!=one)j++,t*=t;z=z.pow(1ll<<(e-j-1));x*=z;z*=z;y*=z;e=j;}return x;}mint nCk(int n,int k){if(k<0||n<k)return mint(0);return modfact(n)*(modfact(k)).inv()*modfact(n-k).inv();} /*min x s.t. a^x ≡ b (mod M) or -1*/int modlog(mint a,mint b){if(gcd(a.mod(),a.val())!=1){cout<<"\033[1;31mCAUTION: m must be coprime to a.\033[0m"<<endl;assert(false);}long long m=mint::mod();long long sq=round(sqrt(m))+1;unordered_map<long long,long long>ap;mint re=a;for(long long r=1;r<sq;r++){if(ap.find(re.val())==ap.end())ap[re.val()]=r;re*=a;}mint A=a.inv().pow(sq);re=b;for(mint q=0;q.val()<sq;q++){if(re==1&&q!=0)return(q*sq).val();if(ap.find(re.val())!=ap.end())return(q*sq+ap[re.val()]).val();re*=A;}return-1;}; #ifndef hari64 #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #define debug(...) #else #define debug(...) viewer::_debug(__LINE__, #__VA_ARGS__, __VA_ARGS__) #endif // clang-format on template <class T> // clang-format off struct matrix{ vector<vector<T>>A; static matrix I(int n){matrix mat(n);for(int i=0;i<int(n);i++)mat[i][i]=1;return mat;} matrix()=default; matrix(vector<vector<T>>&vvec){A=vvec;} matrix(int n,int m):A(n,vector<T>(m,0)){} matrix(int n,int m,T init):A(n,vector<T>(m,init)){} matrix(int n,vector<T>&vec):A(n,vec){} matrix(int n):A(n,vector<T>(n,0)){} int height()const{return A.size();} int width()const{return A[0].size();} inline vector<T>&operator[](int k){return A[k];} bool operator==(const matrix&B){int n=height(),m=width();if(n!=B.height()or m!=B.width())return false;for(int i=0;i<int(n);i++)for(int j=0;j<int(m);j++)if((*this)[i][j]!=B[i][j])return false;return true;} matrix&operator+=(const matrix&B){int n=height(),m=width();assert(n==B.height()&&m==B.width());for(int i=0;i<int(n);i++)for(int j=0;j<int(m);j++)(*this)[i][j]+=B[i][j];return*this;} matrix&operator-=(const matrix&B){int n=height(),m=width();assert(n==B.height()&&m==B.width());for(int i=0;i<int(n);i++)for(int j=0;j<int(m);j++)(*this)[i][j]-=B[i][j];return*this;} matrix&operator*=(const matrix&B){int n=height(),m=B.width(),p=width();assert(p==B.height());vector<vector<T>>C(n,vector<T>(m,0));for(int i=0;i<int(n);i++)for(int j=0;j<int(m);j++)for(int k=0;k<int(p);k++)C[i][j]+=(*this)[i][k]*B[k][j];A.swap(C);return*this;} matrix&operator^=(long long k){matrix B=matrix::I(height());while(k>0){if(k&1)B*=(*this);*this*=*this;k>>=1ll;}A.swap(B.A);return*this;} matrix operator+(const matrix&B)const{return(matrix(*this)+=B);} matrix operator-(const matrix&B)const{return(matrix(*this)-=B);} matrix operator*(const matrix&B)const{return(matrix(*this)*=B);} matrix operator^(const long long&k)const{return(matrix(*this)^=k);} matrix&operator+=(const T&t){int n=height(),m=width();for(int i=0;i<n;i++)for(int j=0;j<m;j++)(*this)[i][j]+=t;return*this;} matrix&operator-=(const T&t){int n=height(),m=width();for(int i=0;i<n;i++)for(int j=0;j<m;j++)(*this)[i][j]-=t;return*this;} matrix&operator*=(const T&t){int n=height(),m=width();for(int i=0;i<n;i++)for(int j=0;j<m;j++)(*this)[i][j]*=t;return*this;} matrix&operator/=(const T&t){int n=height(),m=width();for(int i=0;i<n;i++)for(int j=0;j<m;j++)(*this)[i][j]/=t;return*this;} matrix operator+(const T&t)const{return(matrix(*this)+=t);} matrix operator-(const T&t)const{return(matrix(*this)-=t);} matrix operator*(const T&t)const{return(matrix(*this)*=t);} matrix operator/(const T&t)const{return(matrix(*this)/=t);} friend ostream&operator<<(ostream&os,matrix&p){int n=p.height(),m=p.width();assert(n>0&&m>0);os<<" (h:"<<p.height()<<", w:"<<p.width()<<")\n";for(int i=0;i<n;i++){os<<'[';for(int j=0;j<m;j++)os<<p[i][j]<<(j==m-1?(i!=n-1?"]\n":"]"):",");}return(os);} bool is_binary(){for(int i=0;i<height();i++)for(int j=0;j<width();j++)if(A[i][j]!=0&&A[i][j]!=1)return false;return true;}; // 行列式 T determinant(){matrix B(*this);int n=height(),m=width();assert(n==m);T ret=1;for(int i=0;i<n;i++){int idx=-1;for(int j=i;j<n;j++)if(B[j][i]!=0)idx=j;if(idx==-1)return 0;if(i!=idx){ret*=-1;swap(B[i],B[idx]);}ret*=B[i][i];T vv=B[i][i];for(int j=0;j<n;j++)B[i][j]/=vv;for(int j=i+1;j<n;j++){T a=B[j][i];for(int k=0;k<n;k++){B[j][k]-=B[i][k]*a;}}}return ret;} // 逆行列 求められない場合は0 matrix inv(){int n=height();if(determinant()==T(0))return matrix(0);matrix a(*(this)),l=I(n),u(n);for(int j=0;j<n;j++)u[0][j]=a[0][j];for(int j=1;j<n;j++)l[j][0]=a[j][0]/u[0][0];for(int k=1;k<n;k++){for(int j=k;j<n;j++)for(int i=0;i<k;i++)a[j][k]-=l[j][i]*u[i][k];u[k][k]=a[k][k];for(int j=k+1;j<n;j++){u[k][j]=a[k][j];for(int i=0;i<k;i++)u[k][j]-=l[k][i]*u[i][j];}for(int j=k+1;j<n;j++)l[j][k]=a[j][k]/u[k][k];}matrix x(n),y=I(n);for(int i=0;i<n;i++)for(int j=0;j<n;j++){for(int k=0;k<j;k++)y[j][i]-=l[j][k]*y[k][i];} T sigma;for(int h=0;h<n;h++)for(int i=n-1;i>=0;i--){sigma=y[i][h];for(int j=i+1;j<n;j++){sigma-=u[i][j]*x[j][h];}x[i][h]=sigma/u[i][i];}return x;} // PA==LU Lは下三角(対角成分1) Uは上三角 tuple<matrix,matrix,matrix>LU_decomposition(){assert(height()==width());int n=height();matrix A(*(this));vector<int>p(n);for(int i=0;i<n;i++)p[i]=i;for(int k=0;k<n-1;k++){T max_a=0;int best_i=-1;for(int i=k;i<n;i++){T absolute=(A[p[i]][k]>=0?A[p[i]][k]:-A[p[i]][k]);if(absolute>=max_a)max_a=absolute,best_i=i;}int i=best_i;swap(p[i],p[k]);T w=T(1)/A[p[k]][k];for(int i=k+1;i<n;i++){A[p[i]][k]*=w;for(int j=k+1;j<n;j++)A[p[i]][j]-=A[p[i]][k]*A[p[k]][j];}} matrix L(n),U(n),P(n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){L[i][j]=(i>j?A[p[i]][j]:T(0));U[i][j]=(i<=j?A[p[i]][j]:T(0));}L[i][i]=T(1);P[i][p[i]]=T(1);}return{P,L,U};} }; // clang-format on template <class T> int Gauss_Jordan(matrix<T>& m) { assert(m.is_binary()); int rank = 0; for (int col = 0; col < m.width(); col++) { int pivot = -1; for (int row = rank; row < m.height(); row++) if (m[row][col]) { pivot = row; break; } if (pivot == -1) continue; swap(m.A[pivot], m.A[rank]); for (int row = 0; row < m.height(); row++) if (row != rank && m[row][col]) for (int c = 0; c < m.width(); c++) m.A[row][c] ^= m.A[rank][c]; assert(m.A[rank][col]); // rank行col列に必ず1が存在する rank++; } return rank; } /* 行列累乗テンプレ: int N; cin >> N; long long exp = 100000000000; matrix<mint> init(N, 1); matrix<mint> mat(N, N); init[0][0] = mint(1); mat ^= exp; matrix ans = mat * init; */ int main() { cin.tie(0); ios::sync_with_stdio(false); int N, M; cin >> N >> M; vector<vector<int>> s(N, vector<int>(M, -1)); for (int i = 0; i < M; i++) { int L; cin >> L; vector<int> As(N); for (int j = 0; j < L; j++) { cin >> As[j]; As[j]--; s[As[j]][i] = 1; } } debug(s); sort(s.begin(), s.end()); s.erase(unique(s.begin(), s.end()), s.end()); cout << mint(2).pow(s.size()) << endl; return 0; }