【发布时间】:2021-08-15 20:45:24
【问题描述】:
我编写了一个程序,它打印 1 到 d 之间的数字的数量,这些数字可以除以 4 个不同的整数:k、l、m、n。这具有 O(d) 的时间复杂度。但是我读到你可以用 O(1) 的时间复杂度做同样的事情,我不知道怎么做。
int k = in.nextInt();
int l = in.nextInt();
int m = in.nextInt();
int n = in.nextInt();
int d = in.nextInt();
int sum = 0;
int i = 1;
while (i <= d) {
if (i % k == 0 || i % l == 0 || i % m == 0 || i % n == 0) {
sum++;
}
i++;
}
System.out.println(sum);
【问题讨论】:
-
你在哪里读到的?
-
这里是第一段codeforces.com/blog/entry/3819@EJoshuaS
-
你熟悉inclusion-exclusion principle吗?首先考虑相同问题的更简单情况。例如,0 到 1000 之间有多少个整数可以被 2 或 3 整除?
-
@Brian 是的,我很熟悉这个原理,因为我也在大学学习数学,但我不明白这会如何降低时间复杂度。
标签: java algorithm math time-complexity