提交时间:2024-03-15 10:56:22

运行 ID: 43414

#include<iostream> using namespace std; bool f[10010]; // 保存那些数可以取到哪些数取不到 int n,a[110],g; // 辗转相除法求最大公约数 int gcd(int a,int b){ if(b==0){ return a; } return gcd(b,a%b); } int main() { cin>>n>>a[0]; g = a[0]; f[a[0]] = 1; // 第一个数肯定可以取到 for(int i=1;i<n;i++){ cin>>a[i]; g=gcd(g,a[i]); f[a[i]] = 1; // a[i]这个数肯定可以取到 } // 如果最大公约数不是1,说明有无数个取不到 if(g!=1){ cout<<-1<<endl; return 0; } // 标记出所有可以取到的数字 for(int i = 1;i<10000;i++){ if(f[i]==1){ for(int j = 0;j<n;j++){ f[i+a[j]] = 1; } } } int ans = 0; for(int i = 1;i<10000;i++){ if(f[i]==0){ ans++; } } cout<<ans<<endl; }