数码
数码
https://ac.nowcoder.com/acm/problem/13221
https://ac.nowcoder.com/acm/problem/13221
emm,数据范围1e9,顶多O(n)复杂度,但是看题可想而知,复杂度要小于O(n),跟数学有关系;再者,i|n形式,可以考虑考虑数论分块;
#include<iostream>
#include<algorithm>
using namespace std;
long long l,r;
long long calculate(long long x,long long k)
{
long long h=0,ans=x/k;//k为第几个数码,ans初始化,对于1~r中,含有k的数的个数为x/k
long long be=k*10,end=min(x,k*10+9);//枚举,例如:10~19
for(;be<=x;be*=10,end=end*10+9)//在1~r中含有多少个,10~19,100~199,1000~1999...类似(不超范围)
{
h=min(x,end);
for(int i=be;i<=h;)
{
long long tag=x/i;
long long lim=min(x/tag,h);//数论分块的结论,x/(x/i),在这个区间里,贡献都一样,为tag
ans+=tag*(lim-i+1);//lim为右端点-1(即lim+1这个数的贡献与前一个数不一样)
i=lim+1;
}
}
return ans;
}
int main()
{
cin>>l>>r;
for(int i=1;i<=9;i++)
{
cout<<calculate(r,i)-calculate(l-1,i)<<endl;
}
return 0;
}

查看13道真题和解析