题目地址: 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;
}
}