题目详细:
题目思路:
对于这个题有一个定理
如果 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:这个题虽然这个定理很重要,但是更重要的是这种打表的方法,我们要学会这种方法,帮助我们在将来的学习过程中可以通过总结规律来得出答案。