H.Dividing(整除分块)
思路:整除分块.
显然题意可以转化为:求满足 或 的对数。
对于特殊情况:
当 时有 个, 时有 个。
然后我们只需计算出:
因此可以用整除分块解决。
即:答案为:
时间复杂度:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps=1e-8;
const int mod=1e9+7;
ll n,k,ans=0;
void calc(ll n,ll k){
for(ll l=2,r;l<=min(n,k);l=r+1){
r=min(n/(n/l),k);
ans=(ans+((r-l+1)%mod)*((n/l)%mod)%mod)%mod;
}
}
int main(){
scanf("%lld%lld",&n,&k);
ans=(n+k-1)%mod;
calc(n,k);
calc(n-1,k);
printf("%lld\n",ans);
return 0;
}