简要题意:
给定两种互质的硬币面值,求不能用这两个硬币表示出的面值个数。
本题作为 NOIP 2017 \texttt{NOIP 2017} NOIP 2017 的签到题,有一定的难度。
首先,互质 是一个很重要的条件。
为什么要互质?也就是说, gcd ( x , y ) = 1 \gcd(x,y) = 1 gcd(x,y)=1.
众所周知:
a x + b y = k ax + by = k ax+by=k 无解且 k k k 是最大的那个。显然:
a ≤ y − 1 a \leq y-1 a≤y−1
(这是因为, ⌊ a y ⌋ \lfloor \frac{a}{y} \rfloor ⌊ya⌋ 的部分可以当做 a × b a \times b a×b 的整体被列入 b b b 中)
此时, b ≥ 0 b \geq 0 b≥0 则显然有解。所以不可以。 b < 0 b<0 b<0
此时, b b b 越大则 k k k 越大,所以取 a = y − 1 , b = − 1 a = y-1 , b=-1 a=y−1,b=−1.
代入得:
k = ( y − 1 ) x − y = x y − x − y k=(y-1)x - y = xy - x - y k=(y−1)x−y=xy−x−y
(原来这么简单)
时间复杂度: O ( 1 ) O(1) O(1).
实际得分: 100 p t s 100pts 100pts.
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int main(){
int n=read(),m=read();
printf("%lld\n",1ll*n*m-n-m);
return 0;
}