class Solution {
public:staticconstint NUM =8;voidto_vector(const bitset<NUM>& x, vector<int>& out){for(int i =0; i < NUM; i++){
out.push_back(x[i]);}}voidto_bitset(const vector<int>& x, bitset<NUM>& out){for(int i =0; i < x.size(); i++){
out[i]= x[i];}}
bitset<NUM>transfer(const bitset<NUM> st){
bitset<NUM> next;
next[0]=0;
next[NUM -1]=0;for(int i =1; i < NUM -1; i++){if(st[i-1]== st[i+1]){
next[i]=1;}else{
next[i]=0;}}return next;}
vector<int>prisonAfterNDays(vector<int>& cells,int N){
bitset<NUM> st;
unordered_map<bitset<NUM>,int> mapp;
unordered_map<int, bitset<NUM>> rmapp;to_bitset(cells, st);int len =-1, pre =-1;for(int i =0; i < N; i++){if(mapp.find(st)!= mapp.end()){int idx = mapp[st];
len = i - mapp[st];
pre = mapp[st];break;}
mapp[st]= i;
rmapp[i]= st;
st =transfer(st);}
vector<int> ans;if(len ==-1){to_vector(st, ans);return ans;}int now =(N - pre +1)% len;if(now ==0){to_vector(rmapp[pre + len -1], ans);return ans;}to_vector(rmapp[pre + now -1], ans);return ans;}};
实现2(矩阵快速幂)
class Solution {
public:staticconstint NUM =8;typedef vector<int> vec;typedef vector<vec> mat;
mat matmul(const mat& A,const mat& B){
mat C(A.size(),vec(B[0].size()));for(int i =0; i < A.size(); i++){for(int k =0; k < B.size(); k++){for(int j =0; j < B[0].size(); j++){
C[i][j]+= A[i][k]* B[k][j];
C[i][j]%=2;}}}return C;}
mat tomat(vec& A){
mat B(A.size(),vec(1));for(int i =0; i < A.size(); i++){
B[i][0]= A[i];}return B;}
mat matpow(const mat& A,int n){
mat ans(A.size(),vec(A[0].size(),0));for(int i =0; i < ans.size(); i++)
ans[i][i]=1;
mat tmp(A);while(n >0){if(n &1){
ans =matmul(ans, tmp);}
tmp =matmul(tmp, tmp);
n>>=1;}return ans;}
vector<int>prisonAfterNDays(vector<int>& cells,int N){
mat A(cells.size()+1,vec(cells.size()+1));*(A.rbegin()->rbegin())=1;for(int i =1; i < cells.size()-1; i++){
A[i][i-1]=1;
A[i][i+1]=1;*A[i].rbegin()=1;}
cells.push_back(1);auto x =tomat(cells);
A =matpow(A, N);
x =matmul(A, x);
vec ans;for(int i =0; i < cells.size()-1; i++){
ans.push_back(x[i][0]);}return ans;}};