hihocoder 1680 hiho字串2
阿新 • • 發佈:2018-12-16
#1680 : hiho字串2
時間限制:10000ms
單點時限:1000ms
記憶體限制:256MB
描述
我們定義第一代hiho字串是"hiho"。
第N代hiho字串是由第N-1代hiho字串變化得到,規則是:
h -> hio
i -> hi
o -> ho
例如第二代hiho字串是: hiohihioho
第三代是: hiohihohiohihiohihohioho
給定N和K,請你計算第N代hiho字串中的第K個字元是什麼。
輸入
第一行包含一個整數T,代表測試資料的組數。 (1 ≤ T ≤ 10)
以下T行每行包含兩個整數N和K。
對於50%的資料,每一組的N都滿足 1 ≤ N ≤ 15
對於100%的資料, 1 ≤ N ≤ 100, 1 ≤ K ≤ 1000000000
輸出
對於每組資料,輸出一行,包含一個字元代表答案。
樣例輸入
3 1 1 2 5 3 7
樣例輸出
h i o
#include <iostream> #include<bits/stdc++.h> using namespace std; typedef long long ll; ll H[111],I[111],O[111]; int dfs(ll k,int n,int num) { if(n<0) { return num; } if(num==0) { if(H[n]>=k) return dfs(k,n-1,0); else if(H[n]+I[n]>=k) return dfs(k-H[n],n-1,1); else return dfs(k-H[n]-I[n],n-1,2); } else if(num==1) { if(H[n]>=k) return dfs(k,n-1,0); else return dfs(k-H[n],n-1,1); } else if(num==2) { if(H[n]>=k) return dfs(k,n-1,0); else return dfs(k-H[n],n-1,2); } else if(num==-1) { if(H[n]>=k) return dfs(k,n-1,0); else if(H[n]+I[n]>=k) return dfs(k-H[n],n-1,1); else if(H[n]*2+I[n]>=k) return dfs(k-H[n]-I[n],n-1,0); else return dfs(k-2*H[n]-I[n],n-1,2); } } int main() { H[0]=1;I[0]=1;O[0]=1; for(int i=1;i<=100;i++) { H[i]=H[i-1]+I[i-1]+O[i-1]; I[i]=H[i-1]+I[i-1]; O[i]=H[i-1]+O[i-1]; if(H[i]>=1e9) {break;} } ll k; int n; int T; cin>>T; while(T--) { cin>>n>>k; n=min(24,n); char s[10]="hio"; int ans=dfs(k,n-1,-1); printf("%c\n",s[ans]); } return 0; }