【正经题解】数字统计
2024-03-15 10:34:53
发布于:浙江
0阅读
0回复
0点赞
对于每一个数字,考虑三种影响关系:
它对低位的影响
它对高位的影响
高位对低位的影响
然后在递归中实现这三种关系的计算即可。
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
void dp(LL n , LL m , LL *c)
{
LL x = n % 10;
LL y = n / 10;
for (int i = 0 ; i <= x ; i++)
c[i] += m; //当前位对低位的影响,每个都是0~9的范围
for (int i = 0 ; i <= 9 ; i++)
c[i] += m * y; //当前位对的高位影响(高位不为0,在上一个循环中算过)
c[0] -= m; //排除前导0的情况
LL t = y;
while (t) //高位对低位的影响,即都为最大限制数
{
c[t % 10] += (x+1) * m; //算上0
t /= 10;
}
if (y)
dp(y-1 , m*10 , c); //y值在上个while中算过,算下一个未限制数
}
int main()
{
LL r,l;
LL a[10] = {0};
LL b[10] = {0};
scanf ("%lld %lld",&l,&r);
dp(r , 1 , a);
dp(l-1 , 1 , b);
printf("%lld\n",a[2]-b[2]);
return 0;
}
这里空空如也
有帮助,赞一个