小凯的疑惑

题目描述

小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。

输入输出格式

输入格式:

两个正整数 aa 和 bb,它们之间用一个空格隔开,表示小凯中金币的面值。

输出格式:

一个正整数 NN,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。

输入输出样例

输入样例#1:
3 7
输出样例#1: 
11

说明

【输入输出样例 1 说明】

小凯手中有面值为33和77的金币无数个,在不找零的前提下无法准确支付价值为1, 2,4,5,8,111,2,4,5,8,11 的物品,其中最贵的物品价值为 1111,比1111 贵的物品都能买到,比如:

12 = 3 imes 4 + 7 imes 012=3×4+7×0

13 = 3 imes 2 + 7 imes 113=3×2+7×1

14 = 3 imes 0 + 7 imes 214=3×0+7×2

15 = 3 imes 5 + 7 imes 015=3×5+7×0

【数据范围与约定】

对于 30\%30%的数据: 1 le a,b le 501a,b50。

对于 60\%60%的数据: 1 le a,b le 10^41a,b104。

对于100\%100%的数据:1 le a,b le 10^91a,b109。


想法

题目很简单,只要一个式子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.

美好的一天就此结束!!!!

 

原文地址:https://www.cnblogs.com/abcdhh/p/11038160.html