Digital DP
#include <cstdio>#include<cstring>using namespacestd;Const intMax_digit = the;Const intMax_k =10005;Long LongN;intF[max_digit];Long LongMemoize[max_digit][max_digit *9][max_digit *9];intK;intTo_digits (Long Longa) { intRET =0; while(A >0) {F[ret+ +] = a%Ten; A/=Ten; } returnret;}Long LongDfsintDigitBOOLLessintSumintremainder) { if(Digit <0) { returnsum = =0&& remainder = =0; } if(Less && memoize[digit][sum][remainder]! =-1) { returnMemoize[digit][sum][remainder]; } intLimit = less?9: F[digit]; Long LongRET =0; for(inti =0; I <= limit; i++) {ret+ = DFS (digit-1, less | | I < f[digit], (sum + i)% K, (remainder *Ten+ i)%k); } if(less) {Memoize[digit][sum][remainder]=ret; } returnret;}Long LongWorkLong LongN) { if(N <0) { return 0; } if(n = =0) { return 1; } intLen =to_digits (n); if(k >= Max_digit *9) { return 0; } returnDFS (Len-1,false,0,0);}intMain () {intT; scanf ("%d", &t); for(inti =1; I <= t; i++) { intA, B; scanf ("%d%d%d", &a, &b, &k); memset (Memoize,-1,sizeof(memoize)); printf ("Case %d:%lld\n", I, work (b)-Work (A-1)); } return 0;}View Code
Light OJ 1068