結果
問題 | No.74 貯金箱の退屈 |
ユーザー | beet |
提出日時 | 2018-12-05 15:41:51 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 13 ms / 5,000 ms |
コード長 | 1,838 bytes |
コンパイル時間 | 2,357 ms |
コンパイル使用メモリ | 204,228 KB |
最終ジャッジ日時 | 2025-01-06 18:16:18 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
#include<bits/stdc++.h> using namespace std; using Int = long long; template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;} const Int MAX = 202; using BS = bitset<MAX*2>; using mat = vector<BS>; void gauss(mat &v){ int n=v.size(); for(Int i=0;i<n;i++){ for(Int k=i;k<n;k++){ if(v[k][i]){ swap(v[i],v[k]); break; } } for(Int k=0;k<n;k++) if(i!=k&&v[k][i]) v[k]^=v[i]; } } int mrank(mat v,int m){ int n=v.size(); int r=0,c=0; for(int i=0;i<n;i++){ int s=-1; while(c<m){ for(int j=i;j<n;j++){ if(v[j][c]){ s=j; break; } } if(~s) break; c++; } if(c>=m) break; swap(v[i],v[s]); for(int j=0;j<n;j++) if(i!=j&&v[j][c]) v[j]^=v[i]; r++;c++; } return r; } mat mul(const mat &a,const mat &b){ int n=a.size(); vector<vector<int> > tmp(n,vector<int>(n,0)); mat res(n,BS(0)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) tmp[i][j]+=(a[i][k]&b[k][j]); for(int i=0;i<n;i++) for(int j=0;j<n;j++) res[i][j]=tmp[i][j]&1; return res; } mat mat_pow(mat v,int k){ int n=v.size(); mat res(n,BS(0)); for(int i=0;i<n;i++) res[i][i]=1; while(k){ if(k&1) res=mul(res,v); v=mul(v,v); k>>=1; } return res; } //INSERT ABOVE HERE signed main(){ int n; cin>>n; vector<int> d(n),w(n); for(int i=0;i<n;i++) cin>>d[i]; for(int i=0;i<n;i++) cin>>w[i]; mat A(n); for(int i=0;i<n;i++){ d[i]%=n; int x=(i-d[i]+n)%n,y=(i+d[i]+n)%n; A[x][i]=1; A[y][i]=1; } mat Ab(A); for(int i=0;i<n;i++) Ab[i][n]=!w[i]; cout<<(mrank(A,n)==mrank(Ab,n+1)?"Yes":"No")<<endl; return 0; }