数位DP HDU4734

来源:互联网 发布:sql求和 编辑:程序博客网 时间:2024/05/19 05:32
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<set>#include<map>#include<string>using namespace std;typedef long long ll;typedef unsigned long long ull;const ll INFF=1e12;const int INF=0x7f7f7f7f;ll bit[12];ll jie[12];void init()//初始化2和10的幂{    bit[0]=1;    jie[0]=1;    for(int i=1;i<=10;i++)    {        bit[i]=bit[i-1]*2;        jie[i]=jie[i-1]*10;    }}int sum(ll a)//求一个数位数{    if(a==0)        return 1;    int ans=0;    while(a)    {        a/=10;        ans++;    }    return ans;}ll solve(ll a)//求一个数的f(x){    if(a==0)        return 0;    int num=sum(a);    ll ans=0;    for(int i=0;i<=num-1;i++)    {        ans+=bit[i]*(a%10);        a/=10;    }    return ans;}int a[12];int dp[12][100010];ll A;int dfs(int pos,int sum,int flag){    if(pos==-1)    {        return sum<=A;    }    if(sum>A)        return 0;    if(!flag&&dp[pos][A-sum]!=-1)        return dp[pos][A-sum];    int up=flag?a[pos]:9;    int ans=0;    for(int i=0;i<=up;i++)    {        ans+=dfs(pos-1,sum+i*bit[pos],flag&&i==a[pos]);    }    if(!flag)    dp[pos][A-sum]=ans;    return ans;}int res(ll b){    int pos=0;    while(b)    {        a[pos++]=b%10;        b/=10;    }    return dfs(pos-1,0,1);}int main(){    init();    int t;    int ca=1;    scanf("%d",&t);    memset(dp,-1,sizeof(dp));    while(t--)    {        ll a,b;        scanf("%lld%lld",&a,&b);        A=solve(a);        printf("Case #%d: %d\n",ca++,res(b));    }    return 0;}