[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 }
View Code

 

posted @ 2016-05-19 13:32  Ngshily  阅读(153)  评论(0编辑  收藏  举报