买不到的数目(数论)

买不到的数目

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)

要求输出:
一个正整数,表示最大不能买到的糖数

例如:
用户输入:
4 7
程序应该输出:
17

再例如:
用户输入:
3 5
程序应该输出:
7

资源约定:
峰值内存消耗 < 64M
CPU消耗 < 3000ms

思路:刚开始做的时候没有思路,枚举的话不知道上界,后来看了看网上其他博客,上界是最小公倍数,也不知道为啥。我试了试上界是两数相乘的话,也是对的。还有一种做法是一个根据好多定理推出来的公式,直接输出a*b-a-b就是最终结果,也是正确的。

#include
using namespace std;
int vis[1000005];
int gcd(int x,int y)
{
	if(y==1)
		return y;
	return gcd(y,x%y);
}
int main()
{
	int x,y;
	scanf("%d%d",&x,&y);
	int maxn=x*y/gcd(x,y);//int maxn=x*y;
	for(int i=0;i*x<=maxn;i++)
		for(int j=0;j*y<=maxn;j++)
		{
			if(i*x+y*j>maxn)
				break;
			vis[i*x+y*j]=1;
		}
	int flag=0;
	for(int i=maxn;i>0;i--)
	{
		if(!vis[i])
		{
			printf("%d\n",i);break;
		}
	}
	return 0;
}

你可能感兴趣的:(蓝桥杯)