#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