标签:style class blog http tar get
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734
题意:对于一个n位的十进制数字x=(AnAn-1An-2 ... A2A1),定义 F(x)=An*2n-1+An-1*2n-2+ ...+A2*2+A1*1。给出A、B,求在[0,B]之间有多少数字满足F(x)<=F(A)?
思路:数位DP。f[dep][x]表示到达dep剩余为x的方案数。
i64 n,m;
i64 f[25][N];
int a[25],num;
i64 Sum;
i64 DFS(int dep,int flag,int cur)
{
if(cur<0) return 0;
if(dep==-1) return 1;
if(!flag&&f[dep][cur]!=-1) return f[dep][cur];
int M=flag?a[dep]:9;
i64 ans=0,i;
for(i=0;i<=M;i++)
{
ans+=DFS(dep-1,flag&&i==M,cur-i*(1<<dep));
}
if(!flag) f[dep][cur]=ans;
return ans;
}
i64 cal()
{
num=0;
while(n) a[num++]=n%10,n/=10;
Sum=0;
int i,j;
FOR0(i,num) Sum+=a[i]*(1<<i);
num=0;
while(m) a[num++]=m%10,m/=10;
return DFS(num-1,1,Sum);
}
int main()
{
clr(f,-1);
int num=0;
rush()
{
scanf("%I64d%I64d",&n,&m);
printf("Case #%d: %I64d\n",++num,cal());
}
}
标签:style class blog http tar get
原文地址:http://www.cnblogs.com/jianglangcaijin/p/3799469.html