题意:
有一个机器,它有 m(2≤m≤30) 个彩灯和一个按钮。每按下按钮时,最右边的彩灯会发生一次变换。变换为: 1. 如果当前状态为红色,它将变成绿色; 2.如果当前状态为绿色,它将变成蓝色; 3.如果当前状态为蓝色,它将变成红色,并且它左边的彩灯(如果存在)也会发生一次变换。 初始状态下所有的灯都是红色的。 询问按下按钮 n(1≤n<263) 次以后各个彩灯的颜色。思路:
这个题是一个推理题,看n的取值范围就可以断定,然后就是推理过程,当最右边的是B是他左边的才会变一次,当他左边的变回R时需要最右边的变9次! 那么从右数
第二层就要变27次!才能循环一次!这就得到了规律! 然后直接根据n判断它当前的颜色即可!
代码:
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
char s[100];
int m, i, k;
long long n;
scanf("%d",&k);
while(k--)
{
scanf("%d%I64d",&m,&n);
long long t = 3, p = 1; // t 表示RGB循环一遍(从R到R)需要改变的次数! p是循环一个各个颜色持续的次数
memset(s, 'R', sizeof(s));
for(i = m - 1; i >= 0; i--)
{
//先对它循环一遍改变的次数! 然后除以p根据得到的值判断颜色即可
if((n % t) / p == 0)
s[i] = 'R';
if((n % t) / p == 1)
s[i] = 'G';
if((n % t) / p == 2)
s[i] = 'B';
t *= 3;
p *= 3;
}
s[m] = '\0';
printf("%s\n",s);
}
return 0;
}