相关性质
- 两个数能凑成的所有数,必定是这两个数的最大公约数的倍数,且这个性质可以拓展到多个数
- 因此,当两个数最大公约数(记为$gcd$)不为1时,在零到正无穷的范围内必有无数个不是$gcd$倍数的数,也就是说有无穷多个不能凑成的数,且上界正无穷
- 所以原题保证有一个最大不能组合出的数字,那么所给的两个数,最大公约数必为1(即两数互质)
- 任意两个互质的数$a$、$b$,它们最大不能凑成的数为$ab-a-b$
- 证明?相信玄学
- 类似的题AcWing 1226. 包子凑数,本人题解
代码 $O(1)$
import java.util.*;
import java.lang.*;
public class Main {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int n = scanner.nextInt();
int m = scanner.nextInt();
System.out.println(n * m - n - m);
}
}
套公式就成了
如果不知道这个数学性质 可以DP
不过上界就emmm 没推导只能套一个极大数 看脸过
布尔数组$f(i)$存数字$i$能否被凑成
状态计算$f(i)=f(i-a)||f(i-b)$
初始状态$f(a)=f(b)=true$
复杂度$O(nm)$
import java.util.*;
import java.lang.*;
public class Main {
static Scanner scanner = new Scanner(System.in);
static int n, m, N = 1000 * 1000;
static boolean[] f = new boolean[N];
public static void main(String[] args) {
n = scanner.nextInt();
m = scanner.nextInt();
f[n] = f[m] = true;
for (int i = 1; i <= n * m; i++) {
if (i > n) f[i] |= f[i - n];
if (i > m) f[i] |= f[i - m];
}
int ans = n * m;
while (ans > 0 && f[ans]) ans--;
System.out.println(ans);
}
}