Kiki & Little Kiki 2
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1377 Accepted Submission(s): 727
Problem 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)
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.
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 001000010package hpu; import java.util.Scanner; public class NYLG300 { public static String str = ""; public static int t = 0; public static int len; public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNextInt()) { t = sc.nextInt(); str = sc.next(); sovle(); } } private static void sovle() { len = str.length(); int a[][] = new int[len][len]; a[0][0] = a[0][len-1] = 1; for(int i=1; i<len; i++) { a[i][i] = a[i][i-1] = 1; } int b[][] = new int[len][len]; for(int i=0; i<len; i++) { b[i][i] = 1; } while(t>0) { if((t&1) == 1) { b = matrixMul(a, b); } a = matrixMul(a, a); t >>= 1; } int result[] = new int[len]; for(int i=0; i<len; i++) { result[i] = str.charAt(i)-'0'; } int[] r = new int[len]; for(int i=0; i<len; i++) { for(int j=0; j<len; j++) { r[i] += b[i][j]*result[j]; } r[i] &= 1; } show(r); } private static void show(int[] r) { for(int i=0; i<len; i++) { System.out.print(r[i]); } System.out.println(); } private static int[][] matrixMul(int[][] a, int[][] b) { int[][] result = new int[len][len]; for(int i=0; i<len; i++) { for(int j=0; j<len; j++) { for(int k=0; k<len; k++) { result[i][j] += a[i][k]*b[k][j]; } result[i][j] &= 1; } } return result; } }