题目大意是给你两个整数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;
}


京公网安备 11010502036488号