https://codeforces.ml/contest/1360/problem/D
(题目链接如上)
题意:
总结下来就是在1~k的范围内找到n的最大因数x,ans=n/x
开始的想法:
从min(k,n)开始往下遍历到sqrt(n)找到最大因数。
但是数据范围1e9,第一个样例就会超时。
正解:
从1开始到sqrt(n)遍历所有的因数x,并且判断是否在k的范围内,若在k的范围内就更新ans=min(ans,n/(x))。
复杂度O(n^(1/2)),不会超时。
一些吐槽:
自己对于1到sqrt(n)和sqrt(n)到n的差距的认知还不够。
AC代码:
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
int t,n,k;
cin>>t;
while(t--){
cin>>n>>k;
int ans=n;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){
if(n/i<=k){
ans=min(ans,n/(n/i));
}
if(i<=k){
ans=min(ans,n/i);
}
}
}
cout<<ans<<endl;
}
return 0;
}