[ZJOI2010] 숫자 개수
1911 단어 숫자.
/**
* Problem:Count
* Author:Shun Yao
* Time:2013.5.31
* Result:Accepted
* Memo:DP
*/
#include <cstdio>
#include <cstring>
long long ans[10], s[15], tmp[10], f[15][10][10];
void calc(long long b, char y) {
long i, j, l, t, k;
long long q;
if (b == 0) {
if (y)
++ans[0];
else
--ans[0];
return;
}
memset(s, 0, sizeof s);
memset(f, 0, sizeof f);
memset(tmp, 0, sizeof tmp);
k = 0;
while (b) {
s[++k] = b % 10;
b /= 10;
}
q = 1;
for (i = 1; i <= k; ++i) {
for (j = 0; j <= 9; ++j) {
f[i][j][j] = q;
for (l = 0; l <= 9; ++l)
for (t = 0; t <= 9; ++t)
f[i][j][l] += f[i - 1][t][l];
}
q *= 10;
}
if (k > 0) {
for (j = 2; j <= k; ++j)
tmp[s[j]] += s[1] + 1;
for (l = 0; l <= 9; ++l)
for (j = 0; j <= s[1]; ++j)
tmp[l] += f[1][j][l];
}
q = 10;
for (i = 2; i < k; ++i) {
for (j = i + 1; j <= k; ++j)
tmp[s[j]] += s[i] * q;
for (l = 0; l <= 9; ++l)
for (j = 0; j < s[i]; ++j)
tmp[l] += f[i][j][l];
q *= 10;
}
if (k > 2) {
for (i = 0; i <= 9; ++i)
tmp[i] += f[1][i][i];
for (i = 2; i < k; ++i)
for (j = 0; j <= 9; ++j)
for (l = 1; l <= 9; ++l)
tmp[j] += f[i][l][j];
for (i = 1; i < s[k]; ++i)
for (j = 0; j <= 9; ++j)
tmp[j] += f[k][i][j];
}
for (i = 0; i <= 9; ++i)
if (y)
ans[i] = tmp[i];
else
ans[i] -= tmp[i];
}
int main() {
long i;
long long a, b;
freopen("count.in", "r", stdin);
freopen("count.out", "w", stdout);
scanf("%lld%lld", &a, &b);
calc(b, 1);
calc(a - 1, 0);
printf("%lld", ans[0]);
for (i = 1; i <= 9; ++i)
printf(" %lld", ans[i]);
fclose(stdin);
fclose(stdout);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[ZJOI2010] 숫자 개수텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.