[CF1036C]Classy Numbers

Posted memory-of-winter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1036C]Classy Numbers相关的知识,希望对你有一定的参考价值。

题目大意:多个询问,每个询问问$[l,r](1leqslant lleqslant rleqslant10^{18})$内有多少个数满足非零数位小于等于$3$。

题解:数位$DP$,$f_{i,j}$表示在第$i$位,有$j$个数位不是$0$的方案数

卡点:

 

C++ Code:

#include <cstdio>
#include <cstring>
int Tim, num[20];
long long M[5][20];
long long run(int x, int cnt, int lim) {
	if (cnt > 3) return 0;
	if (!x) return 1;
	if ((~M[cnt][x]) && !lim) return M[cnt][x];
	long long ans = 0;
	for (int op = lim, i = lim ? num[x] : 9; ~i; i--, op = 0) {
		ans += run(x - 1, cnt + bool(i), op);
	}
	if (!lim) M[cnt][x] = ans;
	return ans;
}
long long solve(long long x) {
	int len = 0;
	while (x) {
		num[++len] = x % 10;
		x /= 10;
	}
	return run(len, 0, 1);
}
int main() {
	scanf("%d", &Tim);
	memset(M, -1, sizeof M);
	while (Tim --> 0) {
		long long l, r;
		scanf("%lld%lld", &l, &r);
		printf("%lld
", solve(r) - solve(l - 1));
	}
	return 0;
}

  

以上是关于[CF1036C]Classy Numbers的主要内容,如果未能解决你的问题,请参考以下文章

C. Classy Numbers cf edu round50

dfs打表 C. Classy Numbers

Educational Codeforces Round 50 (Rated for Div. 2) C. Classy Numbers

Educational Codeforces Round 50 (Rated for Div. 2) C. Classy Numbers

Codeforces | CF1028C Rectangles

「CF55D」Beautiful numbers