思路:有一个序列,由从1开始递增,且不包括能整除3或者个位有3的数字。
如:1,2,4,5,6,7,8,11,14,16…(索引从1开始)
输入一个k,输出这个序列第k个数
这题就是记忆化存储,如果之前存过这个索引直接返回,否则就去按规则去找。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int a[N],n;
inline bool check(int x)
{
return !(x%3==0||x%10==3);
}
inline int get(int x)
{
if(n>=x)return a[x];
int num=a[n]+1;
while(n<=x)
{
if(check(num))a[++n]=num;
num++;
}
return a[x];
}
int main() {
int T,x;
cin >> T;
while (T--) {
cin >> x;
cout<<get(x)<<endl;
}
return 0;
}