记住两个
1、辗转相除法
2、互质的两个数,可以凑不出有限个数
代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a[105];
int dp[1000005];
int isPrime(int a,int b)
{
//辗转相除法求最大公约数
if(b==0)return a;
else{
return isPrime(b,a%b);
}
}
int main()
{
scanf("%d",&n);
int flag=0;//用来判断是不是存在互质的
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[a[i]]=1;
if(!i)flag=a[i];
else{
flag = isPrime(flag,a[i]);
}
}
if(flag!=1)
{
printf("INF\n");
}else{
sort(a,a+n);
for(int i=a[0];i<10000;i++)
{
for(int j=0;j<n;j++)
{
if(i<a[j])continue;
if(dp[i-a[j]])
{
dp[i]=1;
}
}
}
int sum=0;
for(int i=1;i<10000;i++)
{
if(!dp[i])
{
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}