• HDU


    Description

    There are n lights in a circle numbered from 1 to n. The left of light 1 is light n, and the left of light k (1< k<= n) is the light k-1.At time of 0, some of them turn on, and others turn off.
    Change the state of light i (if it's on, turn off it; if it is not on, turn on it) at t+1 second (t >= 0), if the left of light i is on !!!Given the initiation state, please find all lights’ state after M second. (2<= n <= 100, 1<= M<= 10^8)

     

    Input

    The input contains one or more data sets. The first line of each data set is an integer m indicate the time, the second line will be a string T, only contains '0' and '1' , and its length n will not exceed 100. It means all lights in the circle from 1 to n.
    If the ith character of T is '1', it means the light i is on, otherwise the light is off.

     

    Output

    For each data set, output all lights' state at m seconds in one line. It only contains character '0' and '1.
     

    Sample Input

    1 0101111 10 100000001
     

    Sample Output

    1111000 001000010

    题意:一排灯,给你初始状态,然后每秒都会有这种操作:假设该盏灯的左边是亮的话,就改变状态,否则不变,最左边的參考最右边的

    思路:非常easy发现有: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("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    7.19 repeater的用法:
    7.18 内置对象
    7.17 三级联动 控件及JS简单使用
    7.15 简单控件 以及 复合控件
    7.14 Repeater
    7.14 ASP.NET介绍 基础
    phpcms图文总结(转载)
    phpcms图文总结(转)
    商业php软件的应用
    php前段时间复习
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4232225.html
Copyright © 2020-2023  润新知