题意:求区间l,r中的数x 及其 x的约数最高位出现的次数
思路:
首先利用前缀和的思想将问题转化成求 [1,r] - [1,l-1]
题目是说求x的约数首位出现次数 自然就想到枚举因子 假设当前有因子a 则另一个边界显然就是x/a
将他们都假设成 L,R 所以问题变成了在L,R中 求最高位为出现的次数
而求L,R中的出现次数 我们可以通过枚举最高位和位数 右区间 - 左区间 + 1 将答案统计即可
过程量记得开LL 否则会炸int
#include <bits/stdc++.h> using namespace std; #define int long long int ansl[15],ansr[15]; int get(int x) { int res = 0; while(x > 0) { res = x% 10; x /= 10; } return res; } void check(int a[],int r) { for(int i = 1;i * i <= r;i ++) { int b = r/i; for(int j = 1;j <= r;j *= 10) { for(int k = 1;k <= 9;k ++) { int x = max(j*k,i + 1); int y = min((j*(k + 1)) - 1,b); if(y - x >= 0) a[k] += y - x + 1; } } int first = get(i); a[first] += b - i + 1; } } signed main() { int l,r; scanf("%lld%lld",&l,&r); check(ansr,r); check(ansl,l - 1); for(int i = 1;i <= 9;i ++) printf("%lld\n",ansr[i] - ansl[i]); return 0; }