
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define maxn 10010
#define mod 2333333
#define LL long long
using namespace std;
struct node
{
int u,v,val ;
bool operator<(const node&s) const
{
return val < s.val ;
}
}qe[maxn];
int fa[maxn] ;
LL ans[maxn] ;
int find(int x )
{
if(x != fa[x])
fa[x] = find(fa[x]) ;
return fa[x] ;
}
LL get(int n )
{
LL ans = 0 ;
sort(qe,qe+n) ;
for(int i = 0 ; i < n ;i++ )
{
int u = find(qe[i].u) ;
int v = find(qe[i].v) ;
if(u==v) continue ;
ans += qe[i].val ;
fa[u] = v ;
}
return ans ;
}
int main()
{
int i ,k,j ;
int x , n , m ;
while( scanf("%d%d",&n,&x ) != EOF )
{
m = 0 ;
for( i = 2 ; i <= 108 ;i++)
{
x = x*907%mod ;
int T = x ;
for(int j = 1 ; j <= i ;j++)
fa[j]=j;
for( j = max(1,i-5) ; j <= i-1 ;j++ )
{
x = 907*x%mod ;
int w = T^x ;
qe[m].u=i;
qe[m].v=j;
qe[m++].val=w ;
}
ans[i] = get(m) ;
// if(i > 108) cout << ans[i]-ans[i-54] << endl;
}
if(n <= 108) cout << ans[n] << endl;
else
{
cout << ans[54+n%54]+(n/54-1)*(ans[108]-ans[54])<< endl ;
}
}
return 0 ;
}
hdu 4896 Minimal Spanning Tree,布布扣,bubuko.com
hdu 4896 Minimal Spanning Tree
原文:http://www.cnblogs.com/20120125llcai/p/3884795.html