HDU - 2276 Kiki & Little Kiki 2 矩阵快速幂

来源:互联网 发布:互联网金融矩阵 编辑:程序博客网 时间:2024/06/10 03:55

题目大意:给出一个由0,1组成的字符串,每一秒的时候,如果该位字符左边是1的话,那么该字符就要变换(由0变1,或者由1变0,第一个的左边是最后一个),问M秒后这个字符串的状态

解题思路:用0,1矩阵来表示变化,具体的请看代码,现在没法给出矩阵,后面会补的

#include<cstdio>#include<cstring>const int N = 110;char str[N];struct Matrix{    int mat[N][N];}A, B, tmp;int n, len, m;int num[N], ans[N];void init() {    for(int i = 0; i < len; i++)        for(int j = 0; j < len; j++) {            A.mat[i][j] = B.mat[i][j] = 0;            if(i == j)                 B.mat[i][j] = A.mat[i][j] = 1;        }    A.mat[len-1][0] = 1;    for(int i = 0; i < len; i++) {        if(i)            A.mat[i-1][i] = 1;        num[i] = str[i] - '0';    }}Matrix matMul(Matrix x, Matrix y) {    for(int i = 0; i < len; i++)        for(int j = 0; j < len; j++) {            tmp.mat[i][j] = 0;            for(int k = 0; k < len; k++)                tmp.mat[i][j] += (x.mat[i][k] * y.mat[k][j] ) % 2;            tmp.mat[i][j] %= 2;        }    return tmp;}void solve() {    while(n) {        if(n & 1)            B = matMul(B,A);        A = matMul(A,A);        n >>= 1;    }}int main() {    while(scanf("%d", &n) != EOF) {        getchar();        scanf("%s", str);        len = strlen(str);        if(n == 0) {            for(int i = 0; i < len; i++)                printf("%c", str[i]);            printf("\n");            continue;        }        init();        solve();        for(int i = 0; i < len; i++) {            int tmp = 0;            for(int j = 0; j < len; j++) {                tmp += (num[j] * B.mat[j][i]) % 2;            }            ans[i] = tmp % 2;        }        for(int i = 0; i < len; i++)            printf("%d", ans[i]);        printf("\n");    }    return 0;}
0 0
原创粉丝点击