【题解】
题意:q次询问(500),每次询问第一个>=n(n<=1e18)的由 3的不同幂次求和得到的值。
思路:题意要求不同幂次,所以我们可以联系到三进制,每一位上是0或者1就是满足,否则考虑把最高位的2变成0并向高位进1,而低位全部变成0,这样的是最优的。3^38>=1e18,所以我们只要考虑38位就好了。
为什么这样是最优的呢?因为我们很容易知道,10000是由02222+1得到的,所以我们把最高位的2变0进位1时,已经保证现在这个数>n了,低位对此没有影响,而且我们需要的是最小的,因此把低位全部变成0.
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[40];
int main()
{
int q; scanf("%d",&q);
while(q--){
memset(a,0,sizeof(a));
ll n; scanf("%lld",&n);
int cnt=0;
while(n){ //n的三进制
a[cnt++]=n%3;
n/=3;
}
ll sum=0,x;
int i,j;
for(i=cnt-1;i>=0;i--)
if(a[i]==2){ //最高位的2
int c=1;