思路:
- 首先将输入的数据转换成3进制,如果三进制中没有2,说明该数直接就是A GOOD NUMBER
- 否则,我们找到最高位的2,然后使它前面第一个为0的位换为1,然后将这一位后面的所有数替换为0,之前的数保持不变,即是所求
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <list>
#include <map>
#define INF 0x3f3f3f3f
#define MID (l + r) >> 1
#define lsn rt << 1
#define rsn rt << 1 | 1
#define Lson lsn, l, mid
#define Rson rsn, mid + 1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxN = 300;
ull n;
ull rem[maxN];
ull fast_power(ull x, ull y)
{
ull base = x, ans = 1;
while(y)
{
if(y & 1)
ans *= base;
base *= base;
y >>= 1;
}
return ans;
}
int main()
{
int q; scanf("%d", &q);
while(q -- )
{
scanf("%llu", &n);
ull constn = n;
ull cnt = 0, pos = 0;
bool two = false;
while(n)
{
rem[cnt] = n % 3;
if(rem[cnt] == 2)
{
pos = cnt;
two = true;
}
cnt ++;
n /= 3;
}
if(!two)
{
printf("%llu\n", constn);
continue;
}
ull ans = 0;
bool first = false;
for(int i = pos + 1; i < cnt; i ++ )
{
if(first && rem[i] == 1)
ans += fast_power(3, i);
if(rem[i] == 0 && !first)
{
ans += fast_power(3, i);
first = true;
}
}
if(!first)
{
ans = fast_power(3, cnt);
}
printf("%llu\n", ans);
}
return 0;
}