• 13成都邀请赛 1007 Good Numbers


    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4722


    考虑怎样的数可以成为good number ,如果不给范围,取一个n位数 (最高位-1)*10*10....最后一位由前面的和决定。    首先不考虑0

    基于这样的思想  比如不超过54321的good number 有多少 ,1~4位有9+9*10+9*10*10(等比求和)  5位就是4*10*10*10+ 第一位是5 剩下的部分mod10==5,而且不超过4321

    这样就可以设计递归了。


    然后就是递归函数设计中 应该是long long的始终不要丢失精度  , 第二个参数递归下降时 不忘+10 再去mod 防止负数,然后f'(n,0)算出的是1-n中good number的个数

    (0总是不会被算进去) 所以还要+1 。  最后把0~(A-1) 里面的个数剔除掉就好了  


    貌似这是山寨解法,应该用数位dp,以后补上

    代码:


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    
    typedef long long inta;
    
    inta pow(int n)
    {
       inta ans=1;
    
       for(int i=0;i<n;i++)
        ans*=10;
    
        return ans;
    
    }
    inta f(inta n,int m)
    {
      if(n<10)
      {
        if(n>=m)  return 1;
        else return 0;
      }
    
      else
      {
          int bit=log10(n);
    
          long long nn=n;
          while(nn>=10)
          {
              nn/=10;
          }
    
          inta high=nn;
    
          inta ans=pow(bit-1)+(high-1)*pow(bit-1)+f(n%pow(bit),((m-high)%10+10)%10);
          return ans;
      }
    
    }
    int main()
    {
      int T;
      cin>>T;
      inta a,b;
      inta na,nb;
      int index=0;
      while(T--)
      {
          cin>>a>>b;
          if(a==0) na=1;
          else
           {
              na=f(a-1,0)+1;
           }
          if(b==0) nb=1;
          else
          {
            nb=f(b,0)+1;
          }
    
          index++;
          cout<<"Case #"<<index<<": ";
          cout<<nb-na<<endl;
    
      }
    }
    



  • 相关阅读:
    Interviewe(hdu3486)
    Cornfields(poj2019)
    C. Watching Fireworks is Fun(Codeforces 372C)
    A. Points on Line
    Fence(poj1821)
    7
    如何使用Visual Studio调试C#程序
    do…while语句
    通过ASP.NET Ajax技术模拟实现NBA比赛文字直播功能
    RecyclerView的基础用法
  • 原文地址:https://www.cnblogs.com/814jingqi/p/3339267.html
Copyright © 2020-2023  润新知