CF1925B A Balanced Problemset? 题解
分析:
我们设分成的 \(n\) 个子任务为 \(a_1 \sim a_n\),即最大化 \(\gcd(a_1,a_2,\dots,a_n)\)。
设这个答案为 \(ans\),\(a_1 = A_1 \times ans,a_2 = A_2 \times ans, \dots ,a_n = A_n \times ans\),那么这 \(n\) 个数的和为 \(ans(A_1 + A_2 + \dots + A_n)\)。
显然,\(A_1 + A_2 + \dots + A_n \geq n\)。所以我们枚举 \(1 \leq ans \leq \lfloor \sqrt{x} \rfloor\),当 \(ans | x\) 时,判断 \(\frac{x}{ans}\) 和 \(ans\) 是否能构成答案,即 \(ans\) 和 \(\frac{x}{ans}\) 分别是否大于 \(n\),再取满足条件的 \(ans\) 中最大值即可。
复杂度 \(O(t \sqrt{x})\)。
#include<bits/stdc++.h>
using namespace std;
int t,x,n,ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> t;
while(t--){
ans = 0;
cin >> x >> n;
for(int i = 1;i * i <= x;i++){
if(!(x % i)){
if(i >= n)
ans = max(ans,x / i);
else if(x / i >= n)
ans = max(ans,i);
}
}
cout << ans << '\n';
}
return 0;
}

浙公网安备 33010602011771号