历届试题 买不到的数目

                                                                                历届试题 买不到的数目  
时间限制:1.0s   内存限制:256.0MB
问题描述

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

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

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

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

输入格式

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

输出格式

一个正整数,表示最大不能买到的糖数

样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7



题解:

首先,要有最大的组合不到的上限,那么输入的数字必须不能同性质(奇偶),不能为1,并且要求互质(题目有问题)

那么我们就可以确定到上限为他们的最小公倍数。然后用dp做出来就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;

int num[1000010];

int lcm(int a, int b){
	int aa = a,bb = b;
	while(bb^=aa^=bb^=aa%=bb);
	return a*b-aa;
}

int main(){
//freopen("in.txt","r",stdin);
	
	int a,b,zui;
    scanf("%d%d",&a,&b);
    num[a] = 1; num[b] = 1;
    int maxn = lcm(a,b);
    for(int i = 1; i < maxn; i++){
    	if(num[i]){
    		if(i+a <= maxn) num[i+a] = 1;
    		if(i+b <= maxn) num[i+b] = 1;
    	}else 
    		zui = i;
    }

    printf("%d",zui);

    
    return 0;   
}


还有数学大神推出了一条公式 a*b-a-b  

推论请看下面链接:点击打开链接

#include<iostream>   
using namespace std;  
  
int main()  
{  
      
    int a,b;  
    cin>>a>>b;  
    cout<<a*b-a-b<<endl;  
      
}  

猜你喜欢

转载自blog.csdn.net/a673953508/article/details/80393817