# 12602 - OuQ String
## 題解:
用遞迴解才不會TLE,共拆成五個部分來判斷,
“O” + sk−1 + “u” + sk−1 + “Q”,
用l跟r的位置來看要不要處理那個部分。
## Code:
```c=1
#include <stdio.h>
#define min(a, b) (a > b ? b : a)
#define max(a, b) (a > b ? a : b)
#define ll long long
ll len[51];
void init(){
// calculate length
len[1] = 3;
for(int i=2; i<=50; i++)
len[i] = 2 * len[i-1] + 3;
}
void solve(ll k, ll l, ll r){
char s[] = "OuQ";
if(k == 1){
for(int i=l; i<=r; i++)
printf("%c", s[i]);
return;
}
ll temp = 0; // position
/* O */
if(l == 0) printf("%c", s[0]);
// Sk-1
if(l<=len[k-1] && r>=1)
solve(k-1, max(l-1, 0), min(r-1, len[k-1]-1));
temp = 1 + len[k-1]; // position of u
/* u */
if(l<=temp && r>=temp) printf("%c", s[1]);
// Sk-1
if(l<=temp+len[k-1] && r>=temp+1)
solve(k-1, max(l-temp-1, 0), min(r-temp-1, len[k-1]-1));
/* Q */
if(r == len[k]-1) printf("%c", s[2]);
}
int main(){
init();
ll k, l, r;
while(scanf("%lld%lld%lld", &k, &l, &r) != EOF){
solve(k, l, r);
printf("\n");
}
return 0;
}
```
###### tags: `NTHUOJ`