题目描述:

alt

思路:

求n和m最大不能买到的糖数 指的是n和m组合之后最大的不能组合出的数字

  • 引理:给定a,b,若d = gcd(a,b) > 1,一定不能凑出最大数 本题保证一定有解,所以不用考虑

代码部分:

  • 方法一:数组暴力遍历(数据范围比较小可以AC)
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int a[MAXN];
int main ()
{
	int m,n;
	cin>>n>>m;
	a[0]=1;
	for(int i=0;i<MAXN;i++)
	{
		if(a[i-n]&&i>=n||a[i-m]&&i>=m) a[i]=1;
	}
	for(int i=MAXN-1;i>0;i--)
	{
		if(!a[i])
		{
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}
  • 方法二:打表(DFS)
#include <bits/stdc++.h>
using namespace std;
bool dfs(int i,int n,int m)
{
	if(i==0) return true;// 递归出口
	
	if(i>=n&&dfs(i-n,n,m)) return true;
	if(i>=m&&dfs(i-m,n,m)) return true;
	
	return false; 
}
int main ()
{
	int n,m;cin>>n>>m;
	int res=0;
	for(int i=1;i<=1000;i++)
	{
		if(!dfs(i,n,m)) res=i; 
	}
	cout<<res<<endl;
	return 0;
} 
  • 方法三:数学分析
// if(gcd(p,q)>1) 一定不能凑出最大数 
// 找规律法
/*
p q m 
3 2 1   4 3 5
3 4 5   4 5 11
3 5 7   4 7 17
3 7 11  4 9 23

在p=3时,q每增加1,m将增加2,所以m=2q+x,得x=-3;m=2q-3;
       m=(p-1)q-p=pq-q-p; 
*/
#include <bits/stdc++.h>
using namespace std;
int main ()
{
	int p,q;cin>>p>>q;
	int m=p*q-p-q;
	cout<<m<<endl;
	return 0;
}
  • 本体结论:两个正整数n,m,最大不能买到的数为:MAX=(p-1)*(q-1)-1;