题目链接
http://lx.lanqiao.cn/problem.page?gpid=T440
解题思路
1.首先根据n<100 & ai<100,可以得到组成的最大数就是10000;
也可以根据 a,b无法组成的最大数为a*b-a-b确定
2.先求出一组数的最小公倍数,当cgcd!=1时,答案就为INF,因为a*n+b*m-1总是无法组成
求一组数的gcd : cgcd=gcd(cgcd,num[i]);
初始时.cgcd=num[0];
3.遍历1~maxnum,标记所有能访问的点,未标记的个数就是ans;
代码展示
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7;
/*
思路:
最大无法组成的数不会超过maxnum;
*/
int num[105];
int gcd(int x,int y){
return y==0 ? x :gcd(y,x%y);
}
bool vis[maxn];
int main(){
int n;
cin>>n;
int cgcd,maxnum;//最大公约数、最小公倍数
for(int i=0;i<n;i++){
cin>>num[i];vis[num[i]]=1;
if(i!=0){
cgcd=gcd(cgcd,num[i]);
maxnum=num[i-1]*num[i]/cgcd;
}
else cgcd=num[i];
}
if(cgcd!=1){
cout<<"INF"<<endl;
return 0;
}
for(int i=0;i<n;i++){
for(int j=num[i];j<=maxnum;j++){
if(vis[j-num[i]])vis[j]=1;
}
}
int ans=0;
for(int i=1;i<=maxnum;i++)
if(!vis[i])ans+=1;
cout<<ans<<endl;
return 0;
}
总结
没啥好总结的,就是普通的题~~~~~