题意:
给定n个数a(i),每种数可以使用无数次,
问有多少种数是无法累加出来的,如果有无限种则输出INF
数据范围:n<=100,1<=a(i)<=100
解法:
求序列的gcd,设gcd为g,
1.如果g!=1,
那么所有数都是g的倍数,
等价于只有g这一种数,也就只能凑出g的倍数,
无法凑出的数有无限种.
2.如果g==1,
无法凑出的数是有限的,
假设只有两个互质数p和q,
他们不能表示的最大数为pq-p-q(这里不给予证明).
100以内互质的最大数为99和100,
那么不能表示的最大数<1e4,
上面讨论的是只有两个数的情况,
当数的数量更多的时候,最大数只可能更小,因为可选择的数更多.
因为取上界为1e4,做可行性完全背包标记可取的数,
最后统计一下不可取的数即可.
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e4+5;
int a[maxm];
int d[maxm];
int n;
signed main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int g=0;
for(int i=1;i<=n;i++)g=__gcd(g,a[i]);
if(g!=1){
cout<<"INF"<<endl;
}else{
d[0]=1;
for(int i=1;i<=n;i++){
for(int j=a[i];j<maxm;j++){
d[j]|=d[j-a[i]];
}
}
int ans=0;
for(int i=1;i<maxm;i++){
if(!d[i])ans++;
}
cout<<ans<<endl;
}
return 0;
}