Codeforces Round #644 (Div. 3) D

D. Buying Shovels

传送门

  • 题目大意:求最大的数q,满足:小于等于k,是n的因数,输出n/q。(n/q的最小值)
  • 思路:如果k大于等于n,答案是1.
    否则,从小到大遍历所有答案i,(i*q==n)
  1. 如果这个答案满足要求,输出。
  2. 始终维护q的最小值(n/i)。如果遍历所有答案后找不到一个能够小于等于k的q(都不满足情况1),那么答案就是维护的q的最小值。
#include<cassert>
#include<string>
#include<cmath>
#include<cstring>
#include<stack>
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
#include<cstdlib>
#pragma warning(disable:4996)
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f
#define itn int
#define ll long long
#define mes(a,k) memset(a,k,sizeof(a))
//#define max(a,b) a>b?a:b
//#define min(a,b) a<b?a:b
//#define pb(a) push_back(a)
#define eps 1e-9
#define PI acos(-1)
using namespace std;
const int N = 2e5 + 5;
using namespace std;
void io(){ ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);}
int main(){
    io();
    int T;
    cin>>T;
    ll a,b;
    while(T--){
        cin>>n>>k;
        if(n<=k){
            cout<<1<<endl;
            continue;
        }
        int flg=0;
        ll ans=linf;
        for(int i=1;i<=sqrt(n);i++){
            if(n%i==0){
                if(n/i<=k){
                    cout<<i<<endl;
                    flg=1;
                    break;
                }
                if(i<=k){
                    ans=min(ans,n/i);
                }
            }
        }
        if(!flg){
            cout<<ans<<endl;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值