zoukankan      html  css  js  c++  java
  • [HDOJ5676]ztr loves lucky numbers(状压枚举,打表,二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676

    题意:输入一个正整数n(n <=10^18),求不小于n的只有4和7组成的数,且4和7数量相同

    枚举2~18位偶数位的4、7的组合,01分别代表4或7。存下来后排序,二分查询。

    trick就是LL存不下20位的数,但是n<=10^18,那么只要特判大于777777777444444444的数都输出44444444447777777777就行了。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long LL;
     5 const int maxn = 1000100;
     6 const int maxm = 22;
     7 LL f[maxn];
     8 LL n;
     9 int m;
    10 int digit[maxm];
    11 
    12 int main() {
    13     // freopen("in", "r", stdin);
    14     // freopen("out", "w", stdout);
    15     int T;
    16     scanf("%d", &T);
    17     m = 0;
    18     for(int len = 2; len <= 18; len+=2) {
    19         int nn = (1 << len);
    20         for(int i = 0; i < nn; i++) {
    21             int a = 0, b = 0;
    22             for(int j = 0; j < len; j++) {
    23                 if((1 << j) & i) digit[j] = 4, a++;
    24                 else digit[j] = 7, b++;
    25             }
    26             if(a != b) continue;
    27             LL tmp = 0;
    28             for(int j = 0; j < len; j++) {
    29                 tmp = tmp * 10 + digit[j];
    30             }
    31             f[m++] = tmp;
    32         }
    33     }
    34     sort(f, f+m);
    35     while(T--) {
    36         scanf("%lld", &n);
    37         if(n > 777777777444444444LL) {
    38             cout << "44444444447777777777" << endl;
    39             continue;
    40         }
    41         cout << f[lower_bound(f, f+m, n) - f] << endl;
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    JAVA处理Clob大对象
    计院生活第二章 深入虎穴(上)
    我的2008
    Quartz入门到精通
    DOM4J使用教程
    JNI简介及实例
    《JavaScript凌厉开发 Ext详解与实践》3月5日开始上架销售
    计院生活第二章 深入虎穴(下)
    Access转Sql Server问题
    提高网站可用性的10个小技巧
  • 原文地址:https://www.cnblogs.com/kirai/p/6795293.html
Copyright © 2011-2022 走看看