题意:求区间[A , B]中能被自身的数位和整除的数有多少个。1 <= A <= B <= 109
分析:由于在DP的过程中不知道最后的数位和是多少,所以状态不好设计,但是考虑到数位和最大是81,所以可以用类似枚举数位和的思想来设计状态。
View Code
#include <stdio.h> #include <string.h> #define N 11 int digit[N]; int dp[N][82][82][82]; int dfs(int pos,int sum,int mod,int m,int f) { if(pos==-1) return (sum==mod&&m==0) ? 1 : 0; if(!f&&dp[pos][sum][mod][m]!=-1) return dp[pos][sum][mod][m]; int ret=0; int max=f ? digit[pos] : 9; for(int i=0;i<=max;i++) { ret+=dfs(pos-1,sum+i,mod,(m*10+i)%mod,f&&i==max); } if(!f) dp[pos][sum][mod][m]=ret; return ret; } int cal(int x) { int pos=0; while(x) { digit[pos++]=x%10; x/=10; } int ret=0; for(int i=1;i<=81;i++) { ret+=dfs(pos-1,0,i,0,1); } return ret; } int main() { int t,a,b,ca=0; memset(dp,-1,sizeof(dp)); scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); printf("Case %d: %d\n",++ca,cal(b)-cal(a-1)); } return 0; }