一.题目描述
二.输入描述
三.输出描述
四.问题分析
几个两两互质的数,最大公约数是1,最小公倍数是他们的乘积。
两个互质的数a和b最小不能表示的数就是(a-1)(b-1)-1,即,两个互质的数a,b可以表示(a-1)(b-1)之后的所有数字。
此定理用于确定数字的上界。(100-1)*(99-1)-110000
如果两个数不互质,则只要不是这两个数最大公约数的倍数都凑不出来。
//包子凑数
#include <iostream>
#include <algorithm>using namespace std;const int MAX=1e5;//数字上限
bool d[MAX]={0};//表示是否能够凑出包子数为i的情况
int baozi[110],ans=0;int gcd(int a,int b){if(a<b)swap(a,b);while(b){int x=a%b;a=b;b=x;}return a;
}int main(int argc, const char * argv[]) {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n,g=0;cin>>n;for(int i=1;i<=n;i++){cin>>baozi[i];if(i==1)g=baozi[i];elseg=gcd(g,baozi[i]);}if(g!=1){cout<<"INF"<<'\n';}else{d[0]=1;for(int i=1;i<=n;i++){for(int j=baozi[i];j<=MAX;j++){d[j]=d[j]|d[j-baozi[i]];}}for(int i=1;i<=MAX;i++){if(d[i]==0)ans++;}}cout<<ans;return 0;
}