• hdu 3943 K-th Nya Number


    http://acm.hdu.edu.cn/showproblem.php?pid=3943

    题目意思是说一个数字由X个4和Y个7和其他不包含4和7的数字组成,则这个数是

    Nya数,求给定区间的第K个Nya数。

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 using namespace std;
     5 #define N 25
     6 #define ll __int64
     7 ll dp[N][N][N],p,q,x,y;
     8 void init()
     9 {
    10     memset(dp,0,sizeof(dp));
    11     dp[0][0][0]=1;
    12     dp[1][0][0]=8;
    13     dp[1][1][0]=1;
    14     dp[1][0][1]=1;
    15     for(int i=2;i<20;i++)
    16     //for(int j=0;j<10;j++)
    17     for(int i1=0;i1<21;i1++)
    18     for(int j1=0;j1<21;j1++){
    19         if(i1>0)
    20         dp[i][i1][j1]+=dp[i-1][i1-1][j1];
    21         if(j1>0)
    22         dp[i][i1][j1]+=dp[i-1][i1][j1-1];
    23         dp[i][i1][j1]+=8*dp[i-1][i1][j1];
    24     }
    25 }
    26 ll solve(ll x1)
    27 {
    28     ll dig[20],cnt=0,flag=0,ans=0,xx=x,yy=y;
    29     while(x1){
    30         dig[++cnt]=x1%10;
    31         x1/=10;
    32     }
    33     for(int i=cnt;i>0&&!flag;i--){
    34         for(int j=0;j<dig[i];j++){
    35             if(j==4&&xx>0)
    36             ans+=dp[i-1][xx-1][yy];
    37             else if(j==7&&yy>0)
    38             ans+=dp[i-1][xx][yy-1];
    39             else if(j!=4&&j!=7)
    40             ans+=dp[i-1][xx][yy];
    41         }
    42         if(dig[i]==4)
    43             xx--;
    44         if(dig[i]==7)
    45             yy--;    
    46         if(xx<0||yy<0)
    47             flag=1;
    48     }
    49     return ans;
    50 }
    51 int main()
    52 {
    53     init();
    54     int t,cas=1;
    55     scanf("%d",&t);
    56     while(t--){
    57         scanf("%I64d%I64d%I64d%I64d",&p,&q,&x,&y);
    58         int n;
    59         ll res1=solve(p+1);
    60         ll res2=solve(q+1);
    61         scanf("%d",&n);
    62         printf("Case #%d:
    ",cas++);
    63         while(n--){
    64             ll a,l=p+1,r=q;
    65             scanf("%I64d",&a);
    66             a+=res1;
    67             if(a<=res1||a>res2){
    68                 printf("Nya!
    ");
    69                 continue;
    70             }
    71             while(r>l){
    72                 ll m=(l+r)>>1;
    73                 ll res3=solve(m+1);
    74                 if(res3>=a)
    75                     r=m;
    76                 else
    77                     l=m+1;
    78             }
    79         printf("%I64d
    ",r);
    80         }
    81     }
    82     return 0;
    83 }
    AC Code
  • 相关阅读:
    适用于小白的 python 快速入门教程
    Centos7.x & RedHat7.x系统忘记 root 密码解决办法
    让我来教你如何免费使用RHEL小红帽系统
    10#Windows注册表的那些事儿
    9#搭建网站
    8#继承和多态
    7#Java基本语句语法
    6#day2总结
    5#关于数据数值的转换
    .NET Core开发日志——配置
  • 原文地址:https://www.cnblogs.com/kim888168/p/3253668.html
Copyright © 2020-2023  润新知