小凯的疑惑
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入输出格式
输入格式:
两个正整数 aa 和 bb,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式:
一个正整数 NN,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例
说明
【输入输出样例 1 说明】
小凯手中有面值为33和77的金币无数个,在不找零的前提下无法准确支付价值为1, 2,4,5,8,111,2,4,5,8,11 的物品,其中最贵的物品价值为 1111,比1111 贵的物品都能买到,比如:
12 = 3 \times 4 + 7 \times 012=3×4+7×0
13 = 3 \times 2 + 7 \times 113=3×2+7×1
14 = 3 \times 0 + 7 \times 214=3×0+7×2
15 = 3 \times 5 + 7 \times 015=3×5+7×0
【数据范围与约定】
对于 30\%30%的数据: 1 \le a,b \le 501≤a,b≤50。
对于 60\%60%的数据: 1 \le a,b \le 10^41≤a,b≤104。
对于100\%100%的数据:1 \le a,b \le 10^91≤a,b≤109。
想法
题目很简单,只要一个式子c=a*b-a-b就行,证明看下面。
代码
#include<iostream> using namespace std; int amin() { long long int a,b,c; cin>>a>>b; c=a*b-a-a; cout<<b; return 0; }
证明
题目可转化为:设a,b是正整数,求$c_0$的最小值能够让任意c>$c_0$,方程ax+by=c有负整数解;
因为a,b互质,可将原方程转化为a*(x*0+b*t)+b*(y*0-a*t)=c。
考虑x的范围
x<0时,不符合题意。
x=0时,$c_0$无限大。
x=b时,c=b的倍数,所以$c_0$无限大。
x>b时,可转化为x<b的情况。
因为我们要c0最大,则需要让x最大,则等于b-1。因为方程无非负整数解,所以y<0。那么我们让y=-1,可知:c0=a*b-a-b。
当c>a*b-a-b时,a*x+b*y>a*b-a-b。b*y>a*b-a-b-a*x>=a*b-a-b-a*(b-1)=-b。则:b*y>-b,y>-1。即:有非负整数解。
上面证明当c>a*b-a-b时,方程成立,下面证明当c=a*b-a-b时,原方程不成立。
a*x+b*y=a*b-a-b
a*b=a*(x+1)+b*(y+1)
所以说,b|(x+1)且a|(y+1)。
所以可得:b<=x+1,a<=y+1。
a*b=a*(x+1)+b*(y+1)>=a*b+a*b=2a*b
a*b>=2a*b,a*b<=0,
方程无非负整数解。
证毕。
注意:因为1<=a,b<=10^9,所以要开long long.
美好的一天就此结束!!!!