**你成功的解决了诚哥找妹子的问题,现在人渣诚想报答你,于是把你带到了他的后宫里,你惊奇的发现这些妹子的排布与树有关,现在人渣诚给了你一些规则让你选择:
1。现在有Ñ个点,人渣诚想要构成有n-1个条边的树
2.每条两边点编号为U,V之间的边上的妹子有GCD(U,V)&T个
“你可以随便构造树”,人渣诚这么说,“我会给你Ñ与吨的值,希望你找到一种方案能让树边上妹子的总和最大。” **总和最大”。
最小生成树
#include<iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n,t,nn,a[1000010];
bool cmp(int a,int b)
{
return (a&t)>(b&t);
}
int fa[1000010];
int getfa(int x)
{
return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
long long kruskal()
{
int ans=0,ednum=0,fb,fe;
for(int i=1;i<=n;i++)
{
for(int j=a[i]*2;j<=n;j+=a[i])
{
if((fb=getfa(a[i]))!=(fe=getfa(j)))
{
fa[fb]=fe;
ans+=a[i]&t;
ednum++;
}
if(ednum==n-1)
return ans;
}
}
return ans;
}
int main()
{
cin>>n>>t;
for(int i=1;i<=n;i++)
a[i]=i;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
fa[i]=i;
cout<<kruskal()<<endl;
return 0;
}
此题时限2ms