题目链接:http://codeforces.com/contest/1206/problem/D
思路:1e18不超过2^63,所以当有126的以上个数时,答案为3
小于126直接暴力
0需要删除,因为当126个数以上,当0参入其中时不计入条件,0与任何数都不产生边
#include<stdio.h>
#include<map>
#include<algorithm>
#define ll long long
using namespace std;
ll A[100010],mp[200][200],d[200][200];
const ll inf=999;
ll floy(ll n)
{
ll ans=inf;
for(ll i=1; i<=n; i++)
{
for(ll j=1; j<=n; j++)
{
if(A[i]&A[j]) d[i][j]=1,mp[i][j]=1;
else d[i][j]=inf;
}
}
for(ll k=1;k<=n;k++)
{
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=n;j++)
{
if(i==j||j==k||i==k) continue;
if(mp[i][k]&&mp[k][j]&&d[i][j]<inf)
{
ans=min(ans,d[i][j]+2);
}
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
return ans==inf?-1:ans;
}
int main()
{
ll x,r=0,n;
scanf("%I64d",&n);
for(ll i=1; i<=n; i++)
{
scanf("%I64d",&x);
if(x!=0)
{
A[++r]=x;
}
}
if(r>126)
{
printf("3\n");
return 0;
}
printf("%I64d\n",floy(r));
}