现在的位置: 首页 > 综合 > 正文

HDU 2276 Kiki & Little Kiki 2 矩阵构造和乘法

2017年11月22日 ⁄ 综合 ⁄ 共 1983字 ⁄ 字号 评论关闭

Kiki & Little Kiki 2

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2032    Accepted Submission(s): 1046

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)

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
/*
HDU 2276 矩阵构造和乘法 
题意:m表示m秒
下面一行表示n个灯(灯是排成环的,也就是说头尾相接)
灯亮暗由 1 0表示
对于任意一盏灯,当左边灯亮时,下一秒该灯将变换状态
问:输出m秒后灯的状态

a1 = (a1+an)%2,a2 = (a1+a2)%2,a3 = (a2+a3)%2,……an = (an+an-1)%2
然后就可以构造出矩阵了,根据上面的等式
初始表^n * 输入表
对于a0a1a2a3 
    |b0b1b2b3|= |1 0 0 1| ^m *|a0a1a2a3|
                |1 1 0 0|
				|0 1 1 0| 
                |0 0 1 1| 
                 
*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define N 101
struct matrix{
	int m[N][N];
};
matrix mat,ans;
char str[101];
int len;

void init()
{
	int i;
	memset(mat.m,0,sizeof(mat.m));
	for(i=1;i<len;i++)
		mat.m[i][i]=mat.m[i][i-1]=1;
	mat.m[0][0]=mat.m[0][len-1]=1;//第一个字符与最后一个结合 
	
}

matrix mul(matrix a,matrix b)
{
	int i,j,k;
	matrix c;
	for(i=0;i<len;i++)
		for(j=0;j<len;j++)
		{
			c.m[i][j]=0;
			for(k=0;k<len;k++)
				c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
		}
	return c;
}

void pow(matrix ma,int n)
{
	int i;
	memset(ans.m,0,sizeof(ans.m));
	for(i=0;i<len;i++)
		ans.m[i][i]=1;
		
	for(;n;n>>=1)
	{
		if(n&1)
			ans=mul(ans,ma);
		ma=mul(ma,ma);
	}
}

int main()
{
	int n,x,i,j;
	
	//freopen("test.txt","r",stdin);	
	while(scanf("%d",&n)!=EOF)
	{
		scanf("%s",str);
		len=strlen(str);
		init();//建立初始的循环矩阵 
		pow(mat,n);//mat^n
		for(i=0;i<len;i++)
		{
			x=0;
			for(j=0;j<len;j++)
				x^=ans.m[i][j]&(str[j]-'0');
			printf("%d",x);
		}
		printf("\n");
	}
	return 0;
} 

抱歉!评论已关闭.