题目描述
知识点
数学问题,some tricks
实现
码前思考
- 题目思想还是很简单,主要是时间复杂度的控制,我第一次提交时是暴力搜索
1~n
的所有因子,果然超时了,后来问了hkt,发现是可以两个因子是同时出现的,所以只需要1~sqrt(n)
内的因子就好了。。。这样就减少了一半的时间复杂度,因为不用判断多余的整除了。。。
代码实现
//我好像只会暴力遍历。。。
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1e9+10;
long long n;
long long k;
int main(){
int test;
scanf("%d",&test);
while(test--){
scanf("%lld %lld",&n,&k);
//从1开始进行遍历么?
if(k >= n){ //大了就直接输出
printf("1\n");
}else{
long long i;
long long ans = INT_MAX;
//不必遍历所有的因子,只需要遍历根号个就可以了,枚举的是内容的多少
for(i=1;i*i<=n;i++){
//如果能够整除并且小于
if(n%i==0){
if(i <= k){
ans = min((n/i),ans);
}else{
//直接break
break;
}
if((n/i) <= k){
ans = min(ans,i);
}
}
}
printf("%lld\n",ans);
}
}
return 0;
}
码后反思
- 注意使用
long long
; - 对于取根号的话,可以直接在条件中判断
i*i<=n
即可,没有必要用sqrt()
;