
审题:混合、再消耗;取值、最小
汇总:关键:期望
基础:特殊情况
注意:稍微理解

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
static int N, ans;
static double p, min = Double.MAX_VALUE / 2; // min是可能的最小期望
static ArrayList<Integer> factors = new ArrayList<>();
// 计算不同K值对应的期望
static double calculateExpected(int K) {
if (K == 1) return N; // 每一个都检测,所以直接是N的消耗
double probabilityAllNegative = Math.pow(1 - p, K);
double expectedTestsPerGroup = probabilityAllNegative * 1 + (1 - probabilityAllNegative) * (1 + K);
return expectedTestsPerGroup * ((double) N / K);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
p = sc.nextDouble();
// 计算所有的约数K
for (int i = 1; i <= Math.sqrt(N); i++) {
if (N % i == 0) {
factors.add(i);
if (N / i != i) {
factors.add(N / i);
}
}
}
// 对K进行升序
Collections.sort(factors);
// 枚举所有可能的约数K,寻找最小期望对应的K
for (int K : factors) {
double currentExpected = calculateExpected(K);
if (currentExpected < min) {
ans = K;
min = currentExpected;
}
}
System.out.println(ans);
}
}