若p和q的最大公约数是d,且d>1,也就是两个数不互质,那么所有不是d的倍数的数都是凑不出来的,此时是无解的,因为凑不出来的数是无穷大。
而题目中说数据保证一定有解,则p和q的最大公约数一定是1,也就是说,p和q一定互质。
裴蜀定理:若p和q的最大公约数是d的话,则必然存在整数a,b(不一定是正整数),使得ap+bq=d。
结论
若a和b均是正整数且互质,那么由 ax+by,x>0,y>0 不能凑出的最大整数是ab-a-b也就是(a-1)*(b-1)-1
暴力打表
暴力的思想在于 若m大于q,则不断枚举q,直到m等于0 或者m<q的时候,然后回溯,枚举p。
暴力打表主要用于找规律
package A3;
public class A_买不到的数目 {
public static void main(String[] args) {
int res=0;
for(int i=1;i<=100;i++) {
if(!dfs(i,4,7)) {
res=i;
}
}
System.out.println(res);
}
public static boolean dfs(int m,int p,int q) {
if(m==0) {
return true;
}
// 若p大于等于m则放p
if(m>=p) {
// 这里if语句的主要作用是用于剪枝 当我们知道这个数能被p和q组成的时候 就直接返回true 结束dfs
if(dfs(m-p,p,q)) {
return true;
}
}
if(m>=q) {
if(dfs(m-q,p,q)) {
return true;
}
}
return false;
}
}
正确做法
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int p=sc.nextInt();
int q=sc.nextInt();
// 可以直接输出公式
System.out.println(p*q-p-q);
}
}