1. 程式人生 > >HDU 3943 —— K-th Nya Number(數位DP,二分答案)

HDU 3943 —— K-th Nya Number(數位DP,二分答案)

給定X和Y的值,一個數字用十進位制表示,對於數位4出現恰好X次,7恰好Y次的數字稱為nya數。

然後給P和Q, 後面是一系列查詢, 每個查詢K就是在區間(P,Q]上找到第K個nya數,不存在則輸出Nya!(= = 這是尖叫的意思麼)

因為數字的範圍比較大,又是跟數位有關,所以採取數位DP的演算法。

dp[i][j][k],代表長度為i的數字中有j個4和k個7的個數。

先用遞推的方法預處理出dp陣列。

dp[i][j][k] += dp[i-1][j][k]*8,第i位不是4和7的情況;

dp[i][j+1][k] += dp[i-1][j][k],第i位為4;

dp[i][j][k+1] += dp[i-1][j][k],第i位為7;

然後讀入p和q的時候先計算出對應的區間裡nya數的個數tmp,然後讀入k,如果k超過tmp就輸出Nya!,否則二分出答案。

#include<cstdio>
#include<cstring>
#define LL long long
#define ull unsigned long long
ull dp[20][21][21];
void init(){
    memset(dp,0,sizeof(dp));
    dp[0][0][0]=1;
    for(int i=1; i<20; i++){
        for(int j=0; j<=20; j++){
            for(int k=0; k<=20; k++)    dp[i][j][k]+=dp[i-1][j][k]*8;
        }
        for(int j=0; j<20; j++){
            for(int k=0; k<=20; k++){
                dp[i][j+1][k]+=dp[i-1][j][k];
                dp[i][k][j+1]+=dp[i-1][k][j];
            }
        }
    }
}
int x, y;
ull query(ull a){
    int buf[20];
    int len=0;
    while(a>0){
        buf[len++]=(int)(a%10);
        a/=10;
    }
    LL sum=0;
    int j=x, k=y;
    for(int i=len-1; i>=0; i--){
        if(buf[i]<=4){
            sum += (LL)buf[i]*dp[i][j][k];
            if(buf[i]==4)   j--;
        }
        else if(buf[i]<=7){
            sum += (LL)(buf[i]-1)*dp[i][j][k];
            if(j)   sum += dp[i][j-1][k];
            if(buf[i]==7)   k--;
        }
        else{
            sum += (LL)(buf[i]-2)*dp[i][j][k];
            if(j)   sum += dp[i][j-1][k];
            if(k)   sum += dp[i][j][k-1];
        }
        if(j<0 || k<0)  break;
    }
    return sum;
}
int t, n;
ull p, q, k, tmp, cur;
int main(){
    init();
    scanf("%d", &t);
    for(int ct=1; ct<=t; ct++){
        printf("Case #%d:\n", ct);
        scanf("%I64u %I64u %d %d", &p, &q, &x, &y);
        tmp = query(q+1)-query(p+1);
        scanf("%d", &n);
        ull low, top, mid;
        while(n--){
            scanf("%I64u", &k);
            if(k>tmp){
                puts("Nya!");
                continue;
            }
            low=p+1; top=q;
            while(low<top){
                mid = (low+top)/2;
                cur = query(mid+1)-query(p+1);
                if(cur<k)   low=mid+1;
                else    top=mid;
            }
            printf("%I64u\n", low);
        }
    }
    return 0;
}


相關推薦

HDU 3943 —— K-th Nya Number數位DP二分答案

給定X和Y的值,一個數字用十進位制表示,對於數位4出現恰好X次,7恰好Y次的數字稱為nya數。 然後給P和Q, 後面是一系列查詢, 每個查詢K就是在區間(P,Q]上找到第K個nya數,不存在則輸出Nya!(= = 這是尖叫的意思麼) 因為數字的範圍比較大,又是跟數位有關,

HDU 3943 K-th Nya Number數位dp+二分

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 numbe

K-th Nya Number 數位dp+二分

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 477

HDU 3943 K-th Nya Number (數位DP)

HDU 3943 K-th Nya Number 用X個4和Y個7的數為規定的數,然後就是區間統計。 先預處理好dp[i][j][k]表示I位的數中有j個4和k個7的數量。 之後就可以通過高位開始列舉,求出區間內有多少個規定的數,如果詢問大於總數,則輸出"Nya!";

K-th Nya NumberHDU-3943

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

POJ2104————K-th Number線段樹二分

K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 51227 Accepted: 17511 Case Time Limit: 2000MS Description

【51Nod - 1094】和為k的連續區間 字首和二分查詢

題幹: 一整數數列a1, a2, ... , an(有正有負),以及另一個整數k,求一個區間i,ji,j,(1 <= i <= j <= n),使得aii + ... + ajj = k。 Input 第1行:2個數N,K。N為數列的長度。K為需

CodeForces - 55D數位dp離散化

題目來源:http://codeforces.com/problemset/problem/55/D Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer numb

HDU 5787 K-wolf Number數位dp

blog typedef turn pan con target ack cnblogs freopen http://acm.split.hdu.edu.cn/showproblem.php?pid=5787 題意:給出一個範圍[l,r]和整數k,求出在該範圍的數在十進

【HDU3943】【K-th Nya Number】【數位+二分找位置】

K-th Nya NumberTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 2493    Accepte

HDOJ3943 K-th Nya Number

題意:在(P,Q】區間內,第K大的滿足條件的數是多少 條件是:數位中有X個4,Y個7 分析: 有X個4,Y個7是很簡單的數位dp dp【pos】【x】【y】:當前pos位,現在已經有了x個4,y個7 注意可以有個小剪枝,即x不能超過X,y不能超過Y 二分的方法與HDO

hdu3709 Balanced Number 數位dp

careful href multi true search target tar sta total 題目傳送門 Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 6553

P2188 小Z的 k 緊湊數 題解數位DP

題目連結 小Z的 k 緊湊數 解題思路 數位DP,把每一個數位的每一個數對應的可能性表示出來,然後求\(num(1,r)-num(1,l-1)\),其中\(num(i,j)\)表示\([i,j]\)區間裡符合要求的數的個數。 其中,\(dp[i][j]\)表示第\(i\)位數字為\(j\)的選擇種數。

3652 B-number數位DP

傳送門 B-number Problem Description A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- st

hdu 2089 記憶化搜尋寫法數位dp

/* 記憶化搜尋,第二維判斷是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi

hdu--2089 不要62數位DP的入門題目

題目連結:不要62 不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 53366

Balanced Number數位DP

it is include 位數 integer 就是 text NPU \n space D - Balanced Number HDU - 3709 A balanced number is a non-negative integer that can be bal

【EOJ3654】管理孩子貪心二分答案

題意:有一棵n個點的樹,其中有k個是關鍵點,將樹分割成若干部分,每部分至少包含一個關鍵點,求最大分割大小的最小值 思路: 最後特判一下f[1]的值 1 #include<cstdio> 2 #include<cstring> 3 #include<st

Android-BAT面試題整理java篇答案

結尾: 如果你是正在找工作,3分理解7分背,先把offer搞下來再說,知識點太多,全部搞懂不太實際。 如果你還在職,正在物色你喜歡的公司,7分理解3分背,掌握基礎鞏固知識,針對你想進的公司,想進的部門的內容去學習,因為時間比較充裕。 不過無論如何請記住,理解才是王道,所有高深的技術點都是基於基礎知識去延伸的,

983B XOR-pyramid區間dp異或

#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include&l