题目描述
小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 N 种蒸笼,其中第 i 种蒸笼恰好能放 Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。
每当有顾客想买 X 个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有 X 个包子。比如一共有 3 种蒸笼,分别能放 3、4 和 5 个包子。当顾客想买 11 个包子时,大叔就会选 2 笼 3 个的再加 1 笼 5 个的(也可能选出 1 笼 3 个的再加 2 笼 4 个的)。
当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有 3 种蒸笼,分别能放 4、5 和 6 个包子。而顾客想买 7 个包子时,大叔就凑不出来了。
小明想知道一共有多少种数目是包子大叔凑不出来的。
输入描述
第一行包含一个整数 N (1 ≤ N ≤100)。
以下 N 行每行包含一个整数 Ai (1 ≤ Ai≤100)。
输出描述
一个整数代表答案。如果凑不出的数目有无限多个,输出 INF。
输入输出样例
示例 1
输入 |
---|
2 4 5 |
输出 |
---|
6 |
样例说明 |
---|
凑不出的数目包括:1, 2, 3, 6, 7, 11。 |
示例 2
输入 |
---|
2 4 6 |
输出 |
---|
INF |
样例说明 |
---|
所有奇数都凑不出来,所以有无限多个 |
运行限制
最大运行时间:1s
最大运行内存: 256M
代码
#include <iostream>
#include <string>
#include<iomanip>
#include <algorithm>
using namespace std;
int arr[101] = { 0 };
int num[10000] = { 0 };
int Prime(int a,int b) {//判断互质,返回值为1则互质
if (b == 0)return a;
else return Prime(b, a % b);
}
int main()
{
int a;
cin >> a;
int flag = 0;
num[0] = 1;
for (int i = 0; i < a; i++)
{
cin >> arr[i];
if (!i)flag = arr[i];
else flag = Prime(flag, arr[i]);
for (int j = 0; j < 10000; j++)
{
if (num[j])
{
num[j + arr[i]] = 1;//将数字对应的倍数的数字记为可凑
}
}
}
if (flag != 1)//没有一个数字互质
{
cout << "INF" << endl;
}
else
{
int all = 0;
for (int j = 0; j < 10000; j++)
{
if (!num[j])//数字不可凑出
{
all++;
}
}
cout << all << endl;
}
return 0;
}
思路
这道题运用到数学思维,根据题目要求可知输入的数字一定要存在互质的数字才存在有限个凑不出的数,同时由于数字的大小有限制所以申请的数组大小为100*100,即10000的大小,保证可以找到所有的凑不出的数字。