标签:des style color os io for ar div
Description
Input
Output
Sample Input
1 0101111 10 100000001
Sample Output
1111000 001000010
题意:一排灯,给你初始状态,然后每秒都会有这样的操作:如果该盏灯的左边是亮的话,就改变状态,否则不变,最左边的参考最右边的
思路:很容易发现有:a1 = (a1+an)%2 , a2 = (a2 + a1) % 2 ......... an = (an + an-1)%2
然后构造类似矩阵: 1 0 0 1 ,位运算快的多,因为这道题的特殊性
1 1 0 0
0 1 1 0
0 0 1 1
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; const int maxn = 105; const int mod = 2; int cnt; struct Matrix { int v[maxn][maxn]; Matrix() {} Matrix(int x) { init(); for (int i = 0; i < maxn; i++) v[i][i] = x; } void init() { memset(v, 0, sizeof(v)); } Matrix operator *(Matrix const &b) const { Matrix c; c.init(); for (int i = 0; i < cnt; i++) for (int j = 0; j < cnt; j++) for (int k = 0; k < cnt; k++) c.v[i][j] ^= (v[i][k] & b.v[k][j]); return c; } Matrix operator ^(int b) { Matrix a = *this, res(1); while (b) { if (b & 1) res = res * a; a = a * a; b >>= 1; } return res; } } a, b, tmp; int main() { int t; char str[maxn]; int num[maxn]; while (scanf("%d", &t) != EOF) { scanf("%s", str); cnt = strlen(str); for (int i = 0; i < cnt; i++) num[i] = str[i] - '0'; a.init(); a.v[0][cnt-1] = a.v[0][0] = 1; for (int i = 1; i < cnt; i++) a.v[i][i] = a.v[i][i-1] = 1; tmp = a^t; int ans[maxn]; memset(ans, 0, sizeof(ans)); for (int i = 0; i < cnt; i++) if (num[i]) for (int j = 0; j < cnt; j++) if (tmp.v[j][i]) ans[j] = (ans[j]+ (tmp.v[j][i]*num[i])%mod) % mod; for (int i = 0; i < cnt; i++) printf("%d", ans[i]); printf("\n"); } return 0; }
HDU - 2276 Kiki & Little Kiki 2,布布扣,bubuko.com
HDU - 2276 Kiki & Little Kiki 2
标签:des style color os io for ar div
原文地址:http://blog.csdn.net/u011345136/article/details/38294437