记录编号 96160 评测结果 AAAAAAAAAA
题目名称 [AHOI 2009] 同类分布 最终得分 100
用户昵称 Gravatardigital-T 是否通过 通过
代码语言 C++ 运行时间 1.242 s
提交时间 2014-04-11 15:44:25 内存使用 12.77 MiB
显示代码纯文本
#include <algorithm>
#include <cstdio>
#include <fstream>
#include <cmath>
	  
using namespace std;
ifstream fi("self.in");
ofstream fo("self.out");
      
typedef long long LL;
      
const int MAXN = 22, MAXS = 166;
      
int cur, idx, a[MAXN], v[2][MAXN][MAXS][MAXS];
LL f[2][MAXN][MAXS][MAXS];//f[less][dep][sum][rem]表示是否已小于N。。处理到dep位。。和还剩下sum。。余数为rem的答案。。
      
LL calc(bool less, int dep, int sum, int rem) {
    if (!dep)
        return !sum && !rem;
    if (v[less][dep][sum][rem] == idx)
        return f[less][dep][sum][rem];
    v[less][dep][sum][rem] = idx;
    f[less][dep][sum][rem] = 0;
    int ed = min(less ? 9 : a[dep], sum);
    for (int i = max(sum - 9 * (dep - 1), 0); i <= ed; ++i)
        f[less][dep][sum][rem] += calc(less || i < a[dep], dep - 1, sum - i, (rem * 10 + i) % cur);
    return f[less][dep][sum][rem];
}
      
inline LL get(LL x) {
    LL ret = a[0] = 0;
    for (; x; x /= 10)
        a[++a[0]] = x % 10;
    for (cur = 1; cur <= a[0] * 9; ++cur) {
        ++idx;
        ret += calc(0, a[0], cur, 0);
    }
    return ret;
}
      
int main() {
	//freopen("self.in","r",stdin);
	//freopen("self.out","w",stdout);
    LL x, y;
    //scanf("%lld%lld", &x, &y);
    //printf("%lld\n", get(y) - get(x - 1));
	fi>>x>>y;
	fo<<get(y)-get(x-1)<<endl;
    return 0;
}