蒟蒻的学习题解
这题一开始我是只会暴力求每个数的约数的 然后肯定超时了
经学习后 我写出了以下程序
主要用了分段处理和把区间转化 x/i就是1-x中含有i的因数的数的个数(重点)
详细的解释在代码里
#include<bits/stdc++.h> using namespace std; #define ll long long ll l,r,ans,s,w; ll f(ll r,ll x) ///x/i就是1-x中含有i的因数的数的个数 { ans=r/x; ///计算当约数最高位为x时的次数 s=x*10,w=min(r,x*10+9); ///确定区间上界和下界 s 下 w 上 for(;s<=r;s*=10,w=w*10+9) ///一个个区间的算 { w=min(w,r); for(ll i=s;i<=w;) { ll sum=r/i; ll z=min(r/sum,w); ///区间跳 z为i 注意可能超过上界 ans+=sum*(z-i+1); i=z+1; ///区间内跳转 } } return ans; } int main(){ cin>>l>>r; for(int i=1;i<=9;i++){ cout<<f(r,i)-f(l-1,i)<<endl; } return 0; }