codeforces 1249C2 Good Numbers (hard version)

题目链接:https://vjudge.net/problem/CodeForces-1249C2

  题目大意就是让你找一个不小于n的数,这个数由3个不同次幂组成(即对于每个3的n次幂最多用一次)我们可以让一个数从3的0次幂一直加到大于等于这个数,然后在从3的高次幂开始减,为什么不倒着减呢因为一个数的高次幂肯定大于它的所有低次幂之和,所以如果倒着减可能会出来更大的数

#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<climits>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define endl '\n'
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
#define mst(a) memset(a, 0, sizeof(a))
#define IOS ios::sync_with_stdio(false)
#define _test printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const double pi = acos(-1.0);
const double eps = 1e-7;
const ll MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int _NAN = -0x3f3f3f3f;
const int NIL = -1;
const int maxn = 2e3;
ll _ls[40] = {1};
int main(void) {
    int t;
    scanf("%d", &t);
    for (int i = 1; i<40; ++i)
        _ls[i] = _ls[i-1]*3;
    while(t--) {
        ll n, sum = 0;
        scanf("%lld", &n);
        int kase = 0;
        while(sum < n)
            sum += _ls[kase++];
        while(kase--)
            if (sum-_ls[kase] >= n)
                sum -= _ls[kase];
        printf("%lld\n", sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shuitiangong/p/12273969.html