B. A Balanced Problemset

原题链接

忠告1:要学会计算时间复杂度!!

忠告2:要学会抓事实,不要掉进题目直观模拟的陷阱里

事实

1.任意k个数的 gcd 一定可以是这k个数的最小值,这里以 k=3 举例
假设 gcd(a1,a2,a3)=m ,则 a1=k1m,a2=k2m,a3=k3m,其中 k1,k2,k3 都是整数
那么可以通过移项变成 a1=(k1+k31)m,a2=k2m,a3=m
2.将n分成k个数的和,这k个数中的最小值 aminnk 对任何n,k都成立
很显然啊,拿 k=2 的情况举个例子就很明显了,k 推广开来也是一样的
3.根据事实12,当 aminn 的因子时,答案就是 amin
于是我们可以 put it into simple words: ,找出 n 的小于 nk 的 最大因子

判断时间复杂度

最坏情况: t=103,n=108,k=11011>108
直接从 nk 开始往下遍历很大概率T
我们考虑优化
由于答案一定是 n 的因子,而因子成对出现(包括1和自身),所以我们开根号找因子,每找一个因子相当于找到两个因子,对每个因子进行判断是否小于 nk
此时 最坏情况 107

Code

#include<bits/stdc++.h>
using namespace std;
int main() {
    ios::sync_with_stdio(false); 
    cin.tie(NULL);
    int t;
    cin >> t;
    while(t--) {
        int n, k;
        cin >> n >> k;
        int result = 1; 
        for(int i = 1; i <= sqrt(n); i++) {
            if(n % i == 0) {
                if(i <= n / k) result = max(result, i);
                if(n / i <= n / k) result = max(result, n / i);
            }
        }
        cout << result << endl;
    }
    return 0;
}

posted @   纯粹的  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示