hdu 3943 K-th Nya Number



#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

long long f[20][21][21][10]={0};
int i,j,k,l,e;

long long tens[21];

long long P,Q;
int X,Y;
int cases;
long long a[110];
int n;

long long findpth(long long Q,int i,int x,int y)
{
    if (i==0) return 0;
    int e=(Q/tens[i])%10;
    if (i==1) e++;
    long long summ=0;
    for (int j=0;j<e;++j)
        summ+=f[i][x][y][j];
    if (e==7)
        return summ+findpth(Q,i-1,x,y-1);
    else if (e==4)
        return summ+findpth(Q,i-1,x-1,y);
    return summ+findpth(Q,i-1,x,y);
}

long long summd[20];
int digits[30];
int nc;

int main()
{
    tens[1]=1;
    for (i=2;i<=19;++i)
        tens[i]=tens[i-1]*10;
    for (i=0;i<=9;++i)
    if(i!=4 && i!=7) f[1][0][0][i]=1;
    f[1][1][0][4]=1;
    f[1][0][1][7]=1;
    for (i=2;i<20;++i)
        for (j=0;j<=i;++j)
            for (k=0;j+k<=i;++k)
                for (l=0;l<=9;++l)
                    if (l==4&&j)
                    {
                        f[i][j][k][l]=0;
                        for (e=0;e<=9;++e)
                            f[i][j][k][l]+=f[i-1][j-1][k][e];
                    }
                    else if (l==7&&k)
                    {
                        f[i][j][k][l]=0;
                        for (e=0;e<=9;++e)
                            f[i][j][k][l]+=f[i-1][j][k-1][e];
                    }
                    else if (l!=4&&l!=7)
                    {
                        f[i][j][k][l]=0;
                        for (e=0;e<=9;++e)
                            f[i][j][k][l]+=f[i-1][j][k][e];
                    }
    scanf("%d",&cases);
    for (nc=1;nc<=cases;++nc)
    {
        cin>>P>>Q>>X>>Y;
        for (i=1;i<=19;++i)
        {
            summd[i]=0;
            for (j=0;j<=9;++j)
                summd[i]+=f[i][X][Y][j];
            //printf("%d %lld\n",i,summd[i]);
        }
        int dip=0,diq=0;
        long long tp=P,tq=Q;
        while (tp)
        {
            dip++;
            tp/=10;
        }
        while (tq)
        {
            diq++;
            tq/=10;
        }
        long long nump=findpth(P,dip,X,Y);
        long long numq=findpth(Q,diq,X,Y);
        scanf("%d",&n);
        for (i=0;i<n;++i)
            cin>>a[i];
        printf("Case #%d:\n",nc);
        for (i=0;i<n;++i)
        {
            if (a[i]>numq-nump)
            {
                puts("Nya!");
                continue;
            }
            long long fa=a[i]+nump;
            for (j=1;j<=19;++j)
                if (fa<=summd[j])
                    break;
            int ej=j;
            int tx=X,ty=Y;
            while (j)
            {
                //printf("j=%d\n",j);
                long long tsum=0;
                for (k=0;k<=9;++k)
                {
                    tsum+=f[j][tx][ty][k];
                    if (tsum>=fa)
                    {
                        tsum-=f[j][tx][ty][k];
                        fa-=tsum;
                        digits[j]=k;
                        j--;
                        if (k==4) tx--;
                        if (k==7) ty--;
                        break;
                    }
                }
            }
            for (k=ej;k>=1;--k)
                printf("%d",digits[k]);
            puts("");
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章