宝鸡市网站建设_网站建设公司_页面权重_seo优化
2025/12/21 20:58:47 网站建设 项目流程

因为 \(n=ab+c\),所以 \(c=n-ab\)

\(c=n-ab\) 代入 \(a+b+kc\),得到 \(a+b+k(n-ab)\),紧接着我们开括号得 \(a+b+kn-kab\),又因为 \(n=ab+c\)\(c\) 是一个非负整数,所以我们需要让这个式子在满足 \(ab+c \le n\) 的条件下最小。

我们考虑去枚举 \(a+b+kn-kab\) 里的 \(a\),那么此时 \(a\)\(kn\) 确定,要想使式子最小,相当于让 \(b-kab\) 最小,因为 \(ka\) 一定大于等于一,所以我们要想让原式最小,一定要让 \(b\) 尽可能地大,那么 \(b\) 的值为 \(\frac{n}{a}\)

我们枚举 \(a\) 时枚举到 \(\sqrt n\) 即可,因为如果 \(a \ge \sqrt n\),那么此时 \(a \ge b\),这种情况我们在 \(a \le sqrt n\) 时已经计算过了,无需再次计算。答案就是枚举 \(a\) 时,所有 \(a+b+kn-kab\) 的值。

时间复杂度 \(O(\sum \sqrt n)\)

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
signed main(){scanf("%lld",&T);while(T--){int n,k;scanf("%lld%lld",&n,&k);int ans=n*k;for(int a=1;a*a<=n;a++){int b=n/a;ans=min(ans,a+b+k*n-k*a*b);}printf("%lld\n",ans);}return 0;
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询