题目链接: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()); } }
时间: 2024-11-03 22:19:18