異或的路徑 n個數字兩兩異或相加之和

2021-09-24 04:39:17 字數 810 閱讀 3308

給一棵 n 個點的樹,1 號節點為根,邊有邊權,令 f(u,v) 表示 u 節點到 v 節點,路徑上邊權異或值。求

第一行乙個整數 n(n≤100000),接下來 n-1 行,第 i 行輸入兩個整數,p[i](p[i] < i), v[i](100000>=v[i]>=1)   (分別表示 i+1號節點的父親,以及 i+1 與 p[i] 相連的邊的權值。
輸出乙個整數表示答案。
先dfs預處理處每個點到根節點的異或值,儲存在陣列w[i]中,那麼f(i,j)=w[i]^w[j]

那麼問題就轉化成w陣列中的n個數兩兩異或的和。

如果列舉i,j複雜度o(n*n);

那麼我們就算一下每乙個二進位制位的異或,比如二進位制的第i位有cnt個是1,那麼就有n-cnt個是0,那麼就有cnt(n-cnt)對(i,j)的第i位是1,第i位的結果就是 (1

typedef long long ll;

const int maxn=1e5+5;

int w[maxn];

const int mod=1e9+7;

int head[maxn],to[maxn],nex[maxn],val[maxn],cnt;

void add(int i,int j,int w)

void dfs(int x)

}int main()

dfs(1);

ll ans=0;

for(int i=0;i<=20;i++)

ans=(ans+(1ll<

}ans=ans*2%mod;

cout<

return 0;

}

陣列中兩兩異或大於m的個數

給定整數m以及n各數字a1,a2,an,將數列a中所有元素兩兩異或,共能得到n n 1 2個結果,請求出這些結果中大於m的有多少個 3.adigit 1,mdigit 0時,字典中第k位為0,異或結果為1,與對應分支所有數異或,結果都會大於m,第k位為1,異或結果為0,遞迴獲得結果 4.adigit...

異或交換兩個數

void swap int a,int b 一般我們可以用異或來進行交換兩個數,以前我也不知道會有這個問題,最近在準備考研寫排序的時候,發現自己寫的swap函式在選擇排序的時候會出現個別0。通過查閱大佬們的部落格,發現問題是由於swap在對同乙個物件進行異或的時候,因為同乙個物件的位址是相同的,所以...

異或的路徑

思路 dfs處理出根節點到全部節點的異或值,然後對每一位二進位制計算貢獻 第i位就是2 i的貢獻,而貢獻的數量就是0和1的數量積,因為只有端點是0和1路徑異或後才是1,該位才會1 最好乘二是終起點可以調換 include include include include include include...