买不到的数目(蓝桥杯C/C++A组真题详解)

题目详细: 

 题目思路:

对于这个题有一个定理

如果 a,b 均是正整数且互质,那么由 ax+by,x≥0,y≥0 不能凑出的最大数是 :

a*b-a-b

具体的证明过程这里就不赘述

感兴趣的同学可以自行查找

这里就提供一种思想

要是当时做题的时候

想不起来或者 

不知道这个定理的时候

我们该去怎么做

具体做法:

打表,打表是一门学问

我们可以通过打表、

去根据最终的答案去猜出这个问题的规律

这里博主就给出打表的一种方法:

#include<iostream>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    int ans=-1;
    for(int i=1;i<=1000;i++){
        int flag=0;
        for(int x=0;x*a<=i;x++){
            for(int y=0;y*b<=i;y++){
                if(x*a+y*b==i) flag=1;
            }
        }
        if(0==flag) ans=i;//如果该数不能被ax+by表示
    }
    
    cout<<ans;
    return 0;
}

然后我们根据数据:

 

 

 

 我们可以观察到:

当a=3固定时,随着b的增加,最后的输出一直在增加,且当b增加1时输出增加了2,b增加2时输出增加了4

所以我们可以推出公式 ans=(3-1)*b-3

当我们固定a=4然后继续尝试时候会发现:

ans=(a-1)*b-a

由于两个a和b可以相互对应

所以我们可以推出

ans=(a-1)(b-1)-1=a*b-a-b

代码详解:

#include<iostream>
using namespace std;

int main(){
    int x,y;
    cin>>x>>y;
    cout<<x*y-x-y;
    return 0;
}

 PS:这个题虽然这个定理很重要,但是更重要的是这种打表的方法,我们要学会这种方法,帮助我们在将来的学习过程中可以通过总结规律来得出答案。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CTGU-Yoghurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值