小凯的疑惑 (数论:gcd) (2023-02-09)

题目链接: https://vjudge.net/contest/540139#problem/E

题意

给出两个互素的正整数 x, y,求出一个最大的正整数 n,使得 ∀a,b∈N (ax+by != n)

(也就是[n+1, +∞] ⊆ {ax+by(a,b∈N)})

0<x,y​≤1e9

思路

引理1

首先,对于互质的 x,y ,任何整数 k 都可以写成 k=cx+dy (c,d ∈ Z) 的形式。因为 ∃a,b (gcd(x,y)=ax+by),而 gcd(x,y)=1,所以任意整数 n 可以写成 n(gcd(x,y)) 的形式。

证明

引理1 得,对于 k 所不能表达的数,必然有 (a<0 || b<0)。令 S = {k|k = ax+by (a<0||b<0, a,b ∈ Z)},那么 S 为满足题意中不能被表达的数。

要求出 S 中所有元素 m = ax+by 的最大值,不妨先令 b=-1,再找找 a 的最大值。

显然,要满足 m ∈ S,在 b=-1 的情况下, a 的值可以取到[-∞, 0]。对于 a 正数的取值,我们一个一个考虑:

  • m = x-y
  • m = 2x-y
  • m = 3x-y

...什么时候不满足 m ∈ S 呢?你可能想到了: a=y。此时有

  • m = yx-y = (x-1)y

由题目条件, x>=1,可知 m 可以被表达为 ax+by (a,b ∈ N),所以 m ∉ S。容易得到 max(a) = y-1

所以 m 的最大值就是 (y-1)x - y = xy - x - y

复杂度 O(1)

代码

#include <iostream>

#define orep(i,l,r) for(auto i = (l); i < (r); ++i)
#define NL          std::cout << '\n';

int main() {
  std::ios::sync_with_stdio(0); std::cin.tie(0);

  int x, y; std::cin >> x >> y;
  std::cout << x*y-x-y;
  
  return 0;
}