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;

  }
}



posted @ 2013-09-12 01:12  814jingqi  阅读(98)  评论(0编辑  收藏  举报