杭電5670Machine
- 1
- 2
有一個機器,它有 m (2\leq m\leq 30)m(2≤m≤30) 個彩燈和一個按鈕。每按下按鈕時,最右邊的彩燈會發生一次變換。變換爲:
- 如果當前狀態爲紅色,它將變成綠色;
2.如果當前狀態爲綠色,它將變成藍色;
3.如果當前狀態爲藍色,它將變成紅色,並且它左邊的彩燈(如果存在)也會發生一次變換。
初始狀態下所有的燈都是紅色的。
詢問按下按鈕 n (1\leq n< {2}^{63})n(1≤n<2
63
) 次以後各個彩燈的顏色。
輸入描述
輸入包含多組數據. 第一行有一個整數T (1\leq T\leq 15)T(1≤T≤15), 表示測試數據的組數. 對於每組數據:
唯一的一行包含2個整數 m (2\leq m\leq 30)m(2≤m≤30) 和 n (1\leq n< {2}^{63})n(1≤n<2
63
) 。
輸出描述
對於每組數據,輸出一個長度爲mm的字符串,表示從左到右mm個彩燈的顏色。
R代表紅色;G代表綠色;B代表藍色。
輸入樣例
2
3 1
2 3
輸出樣例
RRG
GR
我只想說被坑了。一道水題然而被題目坑了,可能也是自己想多了。題目的左邊,一直以爲是他的左邊所有的燈,然而真正的意圖是左邊的一個。知道題目意思了後,其實是一道水題了,一下子就可以找到規律吧。
初始化R==0;G==1;B==2;
第m個燈的狀態就是三次一循環,則可以是n%3;
第m-1個燈的狀態就是n%3^2%3^2====n/3,之後再%3;
之後的就可以變成了一個循環。
for(i = m; i >= 1; i--){
a[i] = n%3;
n = n/3;
}
- 1
- 2
- 3
- 4
然而發這個博客的主要原因不是這個。而是聽了別人說這題的做法後,發現思維真的很奇特,要學習學習所以發這篇博客,還是先看看他們的方法把。轉化爲3進制,剛開始聽到3進制的時候,頓時間超無語的,怎麼與三進制有關啊。我也是頓時進無語了了。後來聽了解釋之後,頓時間驚呆了,這跟我那找規律完全不是一個檔次噠。
轉化爲3進制,其實前面已經有點矛頭了,初始化R==0;G==1;B==2;
0,1,2不就是3進制的基數嗎?並且他那種變化,不知道你們注意沒,是不是進位,對的,就是進位。是不是很簡單了。
無語了,
for(i = 1; i <= n; i++){
a[m]++;
a[m] = a[m]%3;
l = a[m];
while(l == 0){
a[m-1] = a[m-1]+1;
a[m-1] = a[m-1]%3;
l = a[m-1];
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
然而只是超時代碼,突然間還是沒有轉過來啊。其實這個答案就是n轉化爲3進制的結果,還注意一下那個最後還要取摸一下就OK了。
碼上學姐的代碼,真心不想打了。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
char s[]={'R','G','B'};
int main()
{
long long int m,n,x,y;
int i,t;
cin>>t;
while(t--)
{
char b[100];
cin>>m>>n;
int rel = 0;
int mul = 1;
for(i=1;i<=m;i++){
mul*=3;
}
n %= mul;
while(n)
{
y = n%3;
b[rel++] = s[y];
n /= 3;
}
for(i=1;i<=m-rel;i++)
cout<<"R";
for(i=rel-1;i>=0;i--)
cout<<b[i];
cout<<endl;
}
return 0;
}