我们还是转化一下,通解转化为\begin{aligned}\left({b\left(ax_0+\frac{rx_0}b+t\right),a\left(by_0+\frac{ry_0}a-t\right)}\right)\end{aligned},注意这里的除法是实数除法。那么现在需要证明\begin{aligned}ax_0+\frac{rx_0}b+t\end{aligned}和\begin{aligned}by_0+\frac{ry_0}a-t\end{aligned}都大于0。令X=\begin{aligned}ax_0+\frac{rx_0}b+t\end{aligned},Y=\begin{aligned}by_0+\frac{ry_0}a-t\end{aligned},则\begin{aligned}X+Y=ax_0+by_0+\frac{rx_0}b+\frac{ry_0}a=1+r\frac{ax_0+by_0}{ab}=1+\frac r {ab}>1\end{aligned}。注意到这个式子中X和Y一定可以构造出X和Y都大于0的解。
#include <cstdio>
#include <iostream>
using namespace std;
long long int a, b;
int main()
{
scanf("%lld%lld", &a, &b);
printf("%lld\n", a * b - a - b);
return 0;
}
对于这道题的答案a * b - a - b 我有一个比较易懂的解释:
假设两种钱每种最少要拿一次(也就是不能不拿),不能凑成的最小钱数为k,因为a和b互质,显然,k = a * b,(当k = a * b 时,由于ab互质,要么a拿b个,要么b拿a个)。
由于a和b可以一样都不拿,所以ans = k - a - b = a * b - a - b
于是代码略。。。