zoukankan      html  css  js  c++  java
  • HDU 3943 数位dp+二分

    K-th Nya Number

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)
    Total Submission(s): 3155    Accepted Submission(s): 1021


    Problem Description
    Arcueid likes nya number very much.
    A nya number is the number which has exactly X fours and Y sevens(If X=2 and Y=3 , 172441277 and 47770142 are nya numbers.But 14777 is not a nya number ,because it has only 1 four).
    Now, Arcueid wants to know the K-th nya number which is greater than P and not greater than Q.
     
    Input
    The first line contains a positive integer T (T<=100), indicates there are T test cases.
    The second line contains 4 non-negative integers: P,Q,X and Y separated by spaces.
    ( 0<=X+Y<=20 , 0< P<=Q <2^63)
    The third line contains an integer N(1<=N<=100).
    Then here comes N queries.
    Each of them contains an integer K_i (0<K_i <2^63).
     
    Output
    For each test case, display its case number and then print N lines.
    For each query, output a line contains an integer number, representing the K_i-th nya number in (P,Q].
    If there is no such number,please output "Nya!"(without the quotes).
     
    Sample Input
    1 38 400 1 1 10 1 2 3 4 5 6 7 8 9 10
     
    Sample Output
    Case #1: 47 74 147 174 247 274 347 374 Nya! Nya!
     
    Author
    hzhua

     题意:

    求区间内第k个有且仅有x个4和y个7的数

    代码:

    //注意细节
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    int t,x,y,bit[30];
    ll f[30][25][25],P,Q;
    ll dfs(int pos,int xx,int yy,int limit)
    {
        if(pos==0) return (xx==0&&yy==0);
        if(xx<0||yy<0) return 0;
        if(!limit&&f[pos][xx][yy]!=-1) return f[pos][xx][yy];
        int max_b=limit?bit[pos]:9;
        ll ans=0;
        for(int i=0;i<=max_b;i++){
            ans+=dfs(pos-1,xx-(i==4),yy-(i==7),limit&&(i==max_b));
        }
        if(!limit) f[pos][xx][yy]=ans;
        return ans;
    }
    ll solve(ll O)
    {
        int pos=0;
        while(O){
            bit[++pos]=O%10;
            O/=10;
        }
        return dfs(pos,x,y,1);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d",&t);
        for(int cas=1;cas<=t;cas++){
            printf("Case #%d:
    ",cas);
            memset(f,-1,sizeof(f));
            scanf("%lld%lld%d%d",&P,&Q,&x,&y);
            ll tmp1=solve(P);
            ll tmp2=solve(Q);
            int n;ll k;
            scanf("%d",&n);
            while(n--){
                scanf("%lld",&k);
                if(tmp2-tmp1<k) { puts("Nya!");continue; }
                ll l=P+1,r=Q,ans;
                while(l<=r){
                    ll mid=(l+r)>>1;
                    ll tmp=solve(mid);
                    if(tmp-tmp1>=k) { ans=mid;r=mid-1; }
                    else l=mid+1;
                }
                printf("%lld
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    DECLARE
    deallocvt
    科研院所
    jQuery Ajax 确定 form 表单 submit 提交成功
    Java实现 LeetCode 10 正则表达式匹配
    Java实现 LeetCode 10 正则表达式匹配
    Java实现 LeetCode 9 回文数
    Java实现 LeetCode 9 回文数
    Java实现 LeetCode 9 回文数
    Java实现 LeetCode 8 字符串转换整数(atoi)
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/7674185.html
Copyright © 2011-2022 走看看