• 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;
    }
  • 相关阅读:
    数据库总结
    数据库 查询方法详解 以学生老师信息表为例
    SQL 常与LIKE关键字配合使用,表示一个模糊的范围 。
    SQL 数据类型
    十分钟搞清字符集和字符编码
    c# 集合
    c# 开根号 牛顿迭代
    c# 打名字
    转 揭开计算机的神秘面纱 来源:吴广磊的博客
    c# while穷举(凑钱)
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/12273969.html
Copyright © 2020-2023  润新知