#数论#洛谷 3951 JZOJ 5473 小凯的疑惑

题目大意

用两种面值互质的金币支付商品,面值分别是p、q,问在不找零的状况下最贵的商品的价格是多少?html


分析

用一个方程 p x + q y = n ( g c d ( p q ) = 1 ) px+qy=n(gcd(p,q)=1) ,n最大且取不到正整数解。
先说答案是 n = p q p q n=pq-p-q ,可是怎么证实?
用反证法,证实 p x + q y p q p q px+qy\neq pq-p-q ,设 p x + q y = p q p q px+qy=pq-p-q
首先代入原来的方程获得 p x + p + q y + q = p q px+p+qy+q=pq ,也就是 p ( x + 1 ) + q ( y + 1 ) = p q p(x+1)+q(y+1)=pq
由于 g c d ( p , q ) = 1 gcd(p,q)=1 p q ( y + 1 ) p|q(y+1) 因此 p y + 1 p|y+1 ,一样的道理由于 g c d ( p , q ) = 1 gcd(p,q)=1 q p ( x + 1 ) q|p(x+1) 因此 q x + 1 q|x+1
能够设 p i = y + 1 pi=y+1 q j = x + 1 qj=x+1 可得 p q j + q p i = p q pqj+qpi=pq ,因此 j + i = 1 j+i=1
由于 x > 0 x>0 y > 0 y>0 因此 x + 1 > 1 x+1>1 y + 1 > 1 y+1>1 ,即 q j > 1 qj>1 , p i > 1 pi>1 ,由于p,q均为正整数,因此j和i也是正整数,因此 j + i j+i 必然很多于2,与 j + i = 1 j+i=1 矛盾,因此 p x + q y = p q p q px+qy=pq-p-q web


代码

#include <cstdio>
using namespace std;
long long a,b;
int main(){
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	scanf("%lld%lld",&a,&b);
	return !printf("%lld",a*b-a-b);
}