值得水一篇博客
传送门
显然
b
=
k
a
b=ka
b=ka
那么题意:
n
≤
a
<
b
=
k
a
≤
m
n\leq a<b=ka\leq m
n≤a<b=ka≤m 最大化
(
k
−
1
)
a
(k-1)a
(k−1)a
找到
k
1
,
k
2
k_1,k_2
k1,k2满足
m
−
n
<
k
1
n
<
m
m-n<k_1n<m
m−n<k1n<m
m
−
a
<
k
2
a
<
m
m-a<k_2a<m
m−a<k2a<m
那么有
m
−
2
n
<
(
k
1
−
1
)
n
<
m
−
n
m-2n<(k_1-1)n<m-n
m−2n<(k1−1)n<m−n
m
−
2
a
<
(
k
2
−
1
)
a
<
m
−
a
m-2a<(k_2-1)a<m-a
m−2a<(k2−1)a<m−a
而如果
a
>
2
n
则
m
−
a
<
m
−
2
n
a>2n则m-a<m-2n
a>2n则m−a<m−2n
传递性
(
k
2
−
1
)
a
<
(
k
1
−
1
)
n
(k_2-1)a<(k_1-1)n
(k2−1)a<(k1−1)n
所以
n
≤
a
≤
2
n
n\leq a \leq 2n
n≤a≤2n
枚举即可
#include<bits/stdc++.h>
using namespace std;
#define in Read()
int in{
int i=0,f=1; char ch=0;
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') f=-1, ch=getchar();
while(isdigit(ch)) i=(i<<1)+(i<<3)+ch-48, ch=getchar();
return i*f;
}
int T,n,m,ans1,ans2;
int main(){
// freopen("1.in","r",stdin);
T=in;
while(T--){
n=in,m=in;
ans1=0, ans2=0;
for(int a=n;a<2*n;++a){
int b=(m/a)*a;
if(b-a>=ans2-ans1) ans2=b, ans1=a;
}
printf("%d %d\n",ans1,ans2);
}
return 0;
}