/* 矩阵的变形 有一圈灯首尾相连,现在给你初始灯的亮灭情况, 问你按照这种规则如果这个点左边的灯亮着, 那么它改变自己的情况模拟N次后的最终情况 模拟之后就可以课容易得到一个递推试 len = 5 10001 1 11000 0 01100 0 00110 0 00011 1 */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 105; const int mod = 2; struct Mat { int num[N][N]; Mat() { for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) num[i][j] = 0; } }; Mat mul(Mat a, Mat b, int n) { Mat r; for(int i = 0; i < n; i++) for(int k = 0; k < n; k++) { if(a.num[i][k] == 0) continue; for(int j = 0; j < n; j++) { if(b.num[k][j] == 0) continue; r.num[i][j] = (r.num[i][j] + a.num[i][k] * b.num[k][j]) % mod; } } return r; } Mat mal(Mat init, Mat unit, int m, int n) { while(m) { if(m & 1) { unit = mul(init, unit, n); m--; } else { init = mul(init, init, n); m >>= 1; } } return unit; } int main() { int m; while(cin >> m) { char str[N]; cin >> str; Mat init, unit; int len = strlen(str); for(int i = 0; i < len; i++) { unit.num[i][0] = str[i] - '0'; } init.num[0][0] = 1; init.num[0][len - 1] = 1; int k = 0; for(int i = 1; i < len; i++) { for(int j = k; j < k + 2; j++) init.num[i][j] = 1; k++; if(k == len - 1) break; } Mat ans; ans = mal(init, unit, m, len); for(int i = 0 ; i < len; i++) cout << ans.num[i][0]; cout << endl; } }