AtCoder - arc114_a
题意:找出一个数Y使得它与数组a内所有的数a[i]都不互质,即gcd(Y,a[i])!=1
思路:大部分题目都是要求互质的数,本题反其道而行,而且求不互质的数并不容易。
gcd(Y,a[i])!=1意味着什么?即a中每个数都与Y要有一个公因子,可以证明,公因子d必然为质数。
另外,本题的a[i]<=50,因此可以暴力枚举2~50所有的质数,利用二进制枚举模拟所有质数选择的情况,必然能找到一个答案。
code:
#include <bits/stdc++.h>
using namespace std;
#define inf 1e5+10
#define ll long long
const int gm=10010;
const int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};//15个质数
int a[55];
int gcd(ll a,ll b)
{
if(a%b==0)
return b;
else
return (gcd(b,a%b));
}
int main()
{
ll ans=1e18;//ans初始为inf,注意,2到50所有质数相乘差不多是6*1e17,非常大
int tot=15;
int n;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>a[i];
}
for (int j=1;j<=(1<<tot);j++)//二进制枚举
{
ll temp=1;
for (int k=0;k<=tot;k++)
{
if ((j>>k)&1)
{
temp*=prime[k];
//cout<<temp<<endl;
}
}
bool flag=1;
for (int p=0;p<n;p++)//检查和a中的数是否不互质
{
if (gcd(temp,a[p])==1)
{
flag=0;
break;
}
}
if (flag)
ans=min(ans,temp);
}
cout<<ans<<endl;
system("pause");
return 0;
}