BestCoder-Machine(三進位制-彩燈變換)

kewlgrl發表於2016-04-22

Machine

Accepts: 580
Submissions: 1890
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
問題描述
有一個機器,它有 m(2≤m≤30)m (2\leq m\leq 30)m(2m30) 個彩燈和一個按鈕。每按下按鈕時,最右邊的彩燈會發生一次變換。變換為:

1. 如果當前狀態為紅色,它將變成綠色;

2.如果當前狀態為綠色,它將變成藍色;

3.如果當前狀態為藍色,它將變成紅色,並且它左邊的彩燈(如果存在)也會發生一次變換。

初始狀態下所有的燈都是紅色的。
詢問按下按鈕 n(1≤n<263)n (1\leq n< {2}^{63})n(1n<263) 次以後各個彩燈的顏色。
輸入描述
輸入包含多組資料. 第一行有一個整數T(1≤T≤15)T (1\leq T\leq 15)T(1T15), 表示測試資料的組數. 對於每組資料:
唯一的一行包含2個整數 m(2≤m≤30)m (2\leq m\leq 30)m(2m30)n(1≤n<263)n (1\leq n< {2}^{63})n(1n<263)
輸出描述
對於每組資料,輸出一個長度為mmm的字串,表示從左到右mmm個彩燈的顏色。
R代表紅色;G代表綠色;B代表藍色。
輸入樣例
2
3 1
2 3
輸出樣例
RRG
GR

解題思路:
最後一位按照RGBRGBRGB……的順序改變,按照題目意思:
“3.如果當前狀態為藍色,它將變成紅色,並且它左邊的彩燈(如果存在)也會發生一次變換。”
所以從最後一位向前,例如倒數第二位按照RRRGGGBBBRRRGGGBBB的順序改變,即原問題就轉化為求nn的三進製表示的最低的mm位。


/*
* Copyright (c) 2016, 煙臺大學計算機與控制工程學院
* All rights reserved.
* 檔名稱:3.cpp
* 作    者:單昕昕
* 完成日期:2016年4月22日
* 版 本 號:v1.0
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char p[3]= {'R','G','B'};
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long m,n,a[32];
        cin>>m>>n;
        int i;
        for(i=m; i>=1; --i)
        {
            a[i]=n%3;
            n/=3;
        }
        for(i=1; i<=m; i++)
            cout<<p[a[i]];
        cout<<endl;
    }
    return 0;
}


相關文章