C. Floor and Mod
题意:
给你一个式子
⌊
a
b
⌋
\lfloor \frac{a}{b}\rfloor
⌊ba⌋ = a%b。之后再给你两个范围来限制a和b。
问最多有几对组合。
思路:
首先对于a%b,我们可以进行下转换。(主要是翻译下题目条件
)
- a%b = a - ⌊ a b ⌋ ∗ b \lfloor \frac{a}{b} \rfloor * b ⌊ba⌋∗b
- 对于题目 的要求: ⌊ a b ⌋ \lfloor \frac{a}{b}\rfloor ⌊ba⌋ = a%b
- 我们另 k = ⌊ a b ⌋ \lfloor \frac{a}{b}\rfloor ⌊ba⌋ = a%b
- 那么1式 就转换成了 a = k+bk
更加一般地,k在3式中,其实就是代表a%b( ⌊ a b ⌋ \lfloor \frac{a}{b}\rfloor ⌊ba⌋)的结果。
那么我们可以由此得到启发,来枚举k(枚举所有可能的余数)
通过观察样例,可以发现:b>k
再结合4式有:
x
≥
k
2
x\ge k^2
x≥k2 和
x
≥
a
=
k
+
b
k
>
k
2
x\ge a=k+bk > k^2
x≥a=k+bk>k2
(第一个式子是限制枚举k的范围,第二个式子是后面用)
由上式确定b的范围
b
≤
x
k
−
1
b \le \frac{x}{k} -1
b≤kx−1
再结合题意有
1
≤
b
≤
y
1\le b\le y
1≤b≤y
最后每次枚举ans+= m a x ( 0 , m i n ( y , x / k − 1 ) − k ) max(0,min(y,x/k−1)−k) max(0,min(y,x/k−1)−k).
AC
/*
皮卡丘冲鸭!
へ /|
/\7 ∠_/
/ │ / /
│ Z _,< / /`ヽ
│ ヽ / 〉
Y ` / /
イ● 、 ● ⊂⊃〈 /
() へ | \〈
>ー 、_ ィ │ //
/ へ / ノ<| \\
ヽ_ノ (_/ │//
7 |/
>―r ̄ ̄`ー―_
*/
#include <iostream>
#include <bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define mst(x,a) memset(x,a,sizeof(x))
#define pb push_back
#define sz(a) (int)a.size()
#define ALL(x) x.begin(),x.end()
#define mp make_pair
#define fi first
#define se second
#define db double
#define debug(a) cout << #a << ": " << a << endl
using namespace std;
typedef long long LL;
typedef long long ll;
typedef unsigned long long ULL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
typedef pair<int,int>pa;
typedef pair<ll,ll>pai;
typedef pair<db,db> pdd;
const int N = 2e5+10;
const int M = 1e5;
const int maxn=1e6+10;
const db eps = 1e-8;
const db pi = acos(-1.0);
template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ll tt;
cin>>tt;
while(tt--){
ll x, y;
cin>>x>>y;
ll ans = 0;
for(int i = 1; i*i<=x; i ++ ){
ll r = min(y,x/i-1);
ans += max((LL)0,r-i);
}
cout<<ans<<'\n';
}
return 0;
}