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; }