- 思路:
- 整数分块的应用
求 r / x - (l - 1) / x >= k,的个数之和
就是 循环一下从1到r,整数分块,然后注意右边坐标是两者中的最小值 - 代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl '\n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define int long long
#define PII pair<int,int>
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
const int N = 3e5 + 100,M = 4e5 + 100,mod = 998244353,INF = 0x3f3f3f3f;
int l,r,k;
bool check(int gcd)
{
return (r / gcd - (l - 1) / gcd) >= k;
}
void solve()
{
int ans = 0;
cin >> l >> r >> k;
for(int i = 1,j;i <= r;i = j + 1)
{
if(i < l)
{
j = min(r / (r / i),(l - 1) / ((l - 1) / i));
}
else
j = r / (r / i);
ans += (j - i + 1) * check(i);
}
cout << ans << endl;
}
signed main()
{
ios;int T = 1;
while(T -- ) solve();
return 0;
}