(有点ac自动机思想
(和POJ1037一样,输出麻烦 。。
__int64 dp[15][4];
int s[4][10] = {
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 2, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 3, 0, 0, 0},
{3, 3, 3, 3, 3, 3, 3, 3, 3, 3}};
void init()
{
memset(dp,0,sizeof(dp));
dp[0][3] = 1;
for(int i=1; i<15; i++)
for(int j=0; j<4; j++)
for(int k=0; k<10; k++)
dp[i][j] += dp[i-1][s[j][k]];
}
int main()
{
int t, len;
__int64 n;
scanf("%d", &t);
init();
while(t--)
{
scanf("%I64d", &n);
int i = 0;
while( dp[i++][0] < n );
len = i;
int j = 0;
int state = 0;
len--;
while(len)
{
__int64 sum = 0;
while(j <= 9)
{
sum += dp[len - 1][s[state][j]];
if (sum < n) j++;
else break;
}
n -= (sum - dp[len - 1][s[state][j]]);
state = s[state][j];
len--;
printf("%d", j);
j = 0;
}
puts("");
}
return 0;
}