#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef long long arr[10];
long long f[10][10], g[10][10];
arr res;
void prp(void)
{
int i, j;
long long p = 1;
for (i=0; i<=9; i++) f[1][i] = 1;
for (i=1; i<=9; i++) g[1][i] = 1;
for (i=2; i<=9; i++) {
p *= 10;
for (j=0; j<=9; j++) {
f[i][j] = f[i - 1][j] * 10 + p;
if (j) g[i][j] = g[i - 1][j] * 10 + p; else g[i][j] = g[i - 1][j] * 10 + p - 1;
}
}
}
void xx1(long long v, arr a1)
{
int i, j, k;
long long p1;
for (i=0; i<=9; i++) a1[i] = 0;
if (!v) return;
char ss[10]; itoa(v, ss, 10);
int len = strlen(ss);
for (i=0; i<len; i++) {
p1 = 1;
for (j=i+1; j<len; j++) p1 *= 10;
for (j=48; j<ss[i]; j++)
if (i || j - 48) {
for (k=0; k<i; k++) a1[ss[k] - 48] += p1;
a1[j - 48] += p1;
for (k=0; k<=9; k++) a1[k] += f[len - 1 - i][k];
} else {
for (k=0; k<=9; k++) a1[k] += g[len - 1][k];
}
a1[ss[i] - 48]++;
}
}
void xxx(void)
{
long long a, b;
scanf("%lld%lld", &a, &b);
arr w1, w2;
xx1(a - 1, w1); xx1(b, w2);
for (int i=0; i<=9; i++) res[i] = w2[i] - w1[i];
}
void pri(void)
{
for (int i=0; i<=8; i++) printf("%lld ", res[i]);
printf("%lld\n", res[9]);
}
int main(void)
{
prp();
xxx();
pri();
return 0;
}
第2次提交(AC):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned int arr[10];
unsigned int f[10][10], g[10][10];
arr res;
void prp(void)
{
int i, j;
unsigned int p = 1;
for (i=0; i<=9; i++) f[1][i] = 1;
for (i=1; i<=9; i++) g[1][i] = 1;
for (i=2; i<=9; i++) {
p *= 10;
for (j=0; j<=9; j++) {
f[i][j] = f[i - 1][j] * 10 + p;
if (j) g[i][j] = g[i - 1][j] * 10 + p; else g[i][j] = g[i - 1][j] * 10 + p - 1;
}
}
}
void xx1(unsigned int v, arr a1)
{
int i, j, k;
unsigned int p1;
for (i=0; i<=9; i++) a1[i] = 0;
if (!v) return;
char ss[10]; itoa(v, ss, 10);
int len = strlen(ss);
for (i=0; i<len; i++) {
p1 = 1;
for (j=i+1; j<len; j++) p1 *= 10;
for (j=48; j<ss[i]; j++)
if (i || j - 48) {
for (k=0; k<i; k++) a1[ss[k] - 48] += p1;
a1[j - 48] += p1;
for (k=0; k<=9; k++) a1[k] += f[len - 1 - i][k];
} else {
for (k=0; k<=9; k++) a1[k] += g[len - 1][k];
}
a1[ss[i] - 48]++;
}
}
void xxx(void)
{
unsigned int a, b;
scanf("%u%u", &a, &b);
arr w1, w2;
xx1(a - 1, w1); xx1(b, w2);
for (int i=0; i<=9; i++) res[i] = w2[i] - w1[i];
}
void pri(void)
{
for (int i=0; i<=8; i++) printf("%u ", res[i]);
printf("%u\n", res[9]);
}
int main(void)
{
prp();
xxx();
pri();
return 0;
}
两者唯一不同的就是把long long换成了unsigned int。
在第一次提交的结果中,有一个数据应该是1 1(根据输出结果猜的),我的输出竟然有负数(然而,1 1在我的机器上测是对的)。
难道RQ上不给用long long?