這道題卡了好長時間,終於解決了。網上的題解很多提到「xor線性基」,然而並沒有多少講解的。
找學長講了一遍,又找了點資料。終於過了。
關於證明,可以去看看上面那篇部落格。我這裡講一講演算法吧。
關於找線性基;
首先讀入n個64位整數,每個數拆成64位,相當於得到了乙個n*64的矩陣。
從最高位到最低位列舉,如果列舉的當前位為i,找到第乙個i位為1的數,把它交換到a陣列第cnt個位置(cnt表示當前正在找第幾個數),然後其它第i位為1的數與它異或,最後cnt++。
找第k小的數(去重之後):
如果cnt假如消元之後剩下了3個數,對k進行二進位制拆分,第1小ans=3,第2小ans=5;第3小ans=5 xor 3;第4小ans=8; 第5小ans=8 xor 3;......第7小ans=8 xor 5 xor 3;
8和以上就輸出-1;
#include #include #include #include #define ll long long
using namespace std;
const int n = 10000;
ll a[n + 5];
int n;
/*高斯消元計算線性基,返回非0項數目*/
int gauss()
} return cnt - 1;
}/*計算第k小的xor值,忽略重複項*/
ll calkth(ll k, int maxn)
return ans;
}void work()
}int main()
return 0;
}
HDU 3949 XOR 高斯消元
題目大意 給定乙個陣列,求這些陣列通過異或能得到的數中的第k小是多少 首先高斯消元求出線性基,然後將k按照二進位制拆分即可 注意當高斯消元結束後若末尾有0則第1小是0 特判一下然後k 然後hdu輸出long long是用 i64d 無論c艹還是g艹都是 include include include...
HDU 3949 XOR 線性基 高斯消元
hdu 3949 xor hdu3949xor 搞死消元找到一組線性無關組 消出對角矩陣後 對於k二進位制拆分 對於每列只有有乙個1的,顯然可以用k的二進位制數直接異或得到第k大 對於一列由多個1的,由於二進位制性質,由於2的冪 1次方比2的 1到冪 的和要大,所以不影響大小 include inc...
HDU3949 XOR(高斯消元求線性基)
傳送門 題意 給出若干個數,求第k大的異或和 我tm已經沒心情寫這個題解了 就因為找了乙個錯誤的 當對拍這題坑了我一節多晚自習 比較有價值的就是位運算不要輕易用 最好是預處理然後 一下 高斯消元求線性無關組 有n個就說明有2n 1個答案 從大到小排序,將k二進位制分解,選最高位 特判0的情況 inc...