【题解】P14826 踩踩标
因为 \(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;
}

浙公网安备 33010602011771号