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; } }