Kiki & Little Kiki 2
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2511 Accepted Submission(s): 1309
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 001000010
Source
题意:一排灯,开关状态已知,每过一秒:第i个灯会根据刚才左边的那个灯的开关情况变化,如果左边是开的,它就会变化,如果是关的,就保持原来状态。问m秒后的状态。
第1个的左边是最后一个。
解题思路:灯a[i]下一秒的状态就是 (a[i-1]+a[i]) % 2 ,所以可以构造如下矩阵
第1个的左边是最后一个。
假设有5 盏灯
1 0 0 0 1
1 1 0 0 0
0 1 1 0 0
0 0 1 1 0
0 0 0 1 1
所以可以通过矩阵快速幂来解决
include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>
#include <functional>
using namespace std;
struct Matrix
{
int v[105][105];
Matrix()
{
memset(v,0,sizeof v);
}
}k,l;
char ch[105];
Matrix mul(Matrix a,Matrix b,int d)
{
Matrix sum;
for(int i=0; i<d; i++)
{
for(int j=0; j<d; j++)
{
for(int k=0; k<d; k++)
{
sum.v[i][j]+=a.v[i][k]*b.v[k][j];
sum.v[i][j]%=2;
}
}
}
return sum;
}
Matrix mypow(Matrix a,int n,int d)
{
Matrix sum=k;
while(n)
{
if(n&1) sum=mul(sum,a,d);
n>>=1;
a=mul(a,a,d);
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
scanf("%s",ch);
int len=strlen(ch);
Matrix m;
for(int i=0; i<len; i++)
m.v[i][(i+len-1)%len]=1,m.v[i][i]=1;
for(int i=0; i<len; i++)
k.v[i][i]=1;
l=mypow(m,n,len);
for(int i=0;i<len;i++)
{
int ans=0;
for(int j=0;j<len;j++)
ans+=l.v[i][j]*(ch[j]-'0');
printf("%d",ans%2);
}
printf("\n");
}
return 0;
}