题目大意是给你两个整数l,r,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。
这个题我们可以考虑枚举因子,我们考虑从1-r段所有的数码出现次数,我们假设a和b是因子,那么a最大取 ,那么我们就只要两次循环,第一层枚举a,第二层枚举b,但是为了简便运算过程,我们再额外加一层循环,k从1取到9,分别记录a和b的首位数字,这里要注意别重复计数。最后我们直接f(r)-f(l-1)就可以得到结果了~
#include using namespace std; #define int long long int l,r,a[20],b[20]; int ks(int x) { int ans=0; while(x) { ans=x%10; x/=10; } return ans; } void f(int r,int *a) { 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<10;k++) { int x=max(k*j,i+1); int y=min((k+1)*j-1,b); if(y>=x) a[k]+=y-x+1; } } int t=ks(i); a[t]+=b-i+1; } } signed main() { scanf("%lld%lld",&l,&r); f(l-1,a); f(r,b); for(int i=1;i<=9;i++) printf("%lld\n",b[i]-a[i]); return 0; }