#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;
}