[HDU 4734] F(x)
dp[dep][rest]表示长度为dep的F(x)<=rest的数的个数
1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[15],dp[15][5000]; 4 int dfs(int dep,int rest,int flag){ 5 if(rest<0)return 0; 6 if(!dep)return 1; 7 if(!flag&&dp[dep][rest]!=-1)return dp[dep][rest]; 8 int lim=flag?dig[dep]:9; 9 int ans=0; 10 for(int i=0;i<=lim;i++) 11 ans+=dfs(dep-1,rest-i*(1<<(dep-1)),flag&(i==lim)); 12 if(!flag)dp[dep][rest]=ans; 13 return ans; 14 } 15 int solve(int A,int B){ 16 int dd=0; 17 while(A)dig[++dd]=A%10,A/=10; 18 for(int i=dd;i;i--) 19 A=A*2+dig[i]; 20 dd=0; 21 while(B)dig[++dd]=B%10,B/=10; 22 return dfs(dd,A,1); 23 } 24 int main(){ 25 int T,Case=0; 26 scanf("%d",&T); 27 memset(dp,-1,sizeof(dp)); 28 while(T--){ 29 int A,B; 30 scanf("%d%d",&A,&B); 31 printf("Case #%d: %d\n",++Case,solve(A,B)); 32 } 33 return 0; 34 }