数位DP
AC代码:
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; long long c[20][11]; long long get_d (int a[], int n) { int i, j, k; memset(c,0,sizeof(c)); int x = 0; for(i = 1; i <= n; i++){ for(j = 0; j < 10; j++){ for(k = 0; k < 10; k++){ c[i][(j + k) % 10] += c[i - 1][j]; } } for(j = 0; j < a[i]; j++) c[i][(x+j)%10]++; x = (x + a[i]) % 10; } if(x == 0) c[n][0]++; return c[n][0]; } int main() { int T, tt = 0; scanf("%d",&T); while(T--){ int s[20], n, i, j, num = 0; long long ans = 0; char a[20],b[20]; scanf("%s %s", a, b); n = strlen(b); for(i = 0; i < n; i++) s[i + 1] = b[i] - '0'; ans += get_d(s,n); n = strlen(a); for(i = 0; i < n; i++){ s[i + 1] = a[i] - '0'; num += s[i + 1]; } ans -= get_d(s,n); if(num % 10 == 0) ans++; printf("Case #%d: %I64d\n", ++tt, ans); } return 0; }