51nod97B 異或約束和

2022-04-10 04:57:02 字數 970 閱讀 1802

定義\(f(i)\)為\(i\)的所有約數的異或和,給定 \(n(1\le n \le 10^)\) ,求\(f(1) xor f(2) xor f(3) xor...xor f(n)\) (其中\(xor\)表示按位異或)

首先考慮到列舉因數\(x\),然後算出他是小於等於\(n\)的數字中\(x\)的倍數的個數,即\(\lfloor \frac \rfloor\),然後根據奇偶性判斷是否要異或\(x\)

這樣複雜度是\(o(n)\)的,看到\(\frac\)很容易想到數論分塊。

然後問題就是如何快速查詢連續區間的異或和。

設\(s[x]=1^\wedge2^\wedge3...^\wedge x\)

那麼區間\([l,r]\)的異或和就是\(s[r]^\wedge s[l - 1]\)

然後對於\(s\)陣列打個表如下

可以發現在模\(4\)意義下是有規律的。然後就可以\(o(1)\)計算連續區間異或和了。

/*

* @author: wxyww

* @date: 2019-03-24 14:06:25

* @last modified time: 2019-03-24 14:23:58

*/#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

ll read()

while(c>='0'&&c<='9')

return x*f;

}ll n;

ll query(ll l)

int main()

cout<

return 0;

}

51nod 1577 異或湊數

從左到右一共n個數,數字下標從1到n編號。一共m次詢問,每次詢問是否能從第l個到第r個數中 包括第l個和第r個數 選出一些數使得他們異或為k。資料量比較大。輸入請用掛 1 23 4 5 6 7 8 intread 輸出請用puts input 單組測試資料。第一行乙個整數n 0output m行,每...

51nod 2128 字首異或

傳送門 輸入乙個長度為n 1 n 100000 陣列a 1 a 2 a n 輸入乙個詢問數m 1 m 100000 和m組詢問,每組詢問形如 l,r 對於每組詢問 l,r 你需要輸出a l xor a l 1 xor xor a r 1 xor a r 即第l個數字到第r個數字的異或。如果你的演算法...

51nod1301 集合異或和

已知兩個整數n與m,你需要構造兩個整數集合x與y,且需要滿足以下要求 1 對所有的xi x,滿足1 xi n 對所有的yj y,滿足1 yj m x與y可以為空集 2 x y 但不要求集合x與y的元素個數,只要兩者沒有交集即可 不妨設構造後的集合x含有n個元素,而集合y有m個元素,令 a x1 xo...