給定乙個長度為\(n\)初始全為0的數列,下標從1開始。定義操作模k異或v為對所有滿足\(i\equiv 0\:(mod\:k)\)的下標\(i\),將\(a_i\)異或上整數\(v\)(即令\(a_i=a_i\bigoplus\:v\) )。
給出\(q\)次操作,每次操作之後輸出序列的異或和,並且在操作結束之後輸出整個序列。
序列的異或和為\(a_1\bigoplus a_2\bigoplus ...\bigoplus a_n\)
第一行兩個整數\(n,q\)。
接下來q行,每行兩個整數\(k_i,v_i\)。
輸出共\(q+1\)行,其中前\(q\)行每行乙個整數,為每次操作結束後的序列的異或和。
最後一行為操作結束後的序列。
\(1\leq n,q\leq 2*10^5\)
\(0\leq k_i,v_i\leq 10^9\)
可以發現有兩個子問題,其中第乙個:求每次操作完後數列的異或和,是簡單的。
由\(x\bigoplus x=0\)可得,只要求出1-n中有多少個數是\(k_i\)的倍數,如果是奇數個,那麼答案異或上\(v_i\),如果是偶數個,答案不變。
對於第二個子問題,可以想到,既然操作是位運算,那麼應該把每一位拆開來處理,我們把初始陣列a拆成31個0/1陣列,那我們對0/1陣列進行操作,就只需要考慮\(k_i\)
(因為異或\(v_i\)相當於對\(v_i\)每一位對應的0/1陣列進行操作)。
考慮維護1個0/1陣列,每次操作是對於\(k|i\),\(a[i]\bigoplus =1\),那麼可以維護所有的k(相同的合併),對於每個個數為奇數的k掃一遍。可是這樣最壞情況下不是\(n^2\)的時間複雜度嗎?
其實考慮到相同的k會被合併,最壞情況是\(k=1,2,...n\),執行次數為\(\frac+\frac+...+\frac\)。不會超時。
然後把31個0/1陣列的資訊合併就是最後的答案陣列。
#include#include#define maxn 200010
using namespace std;
int a[maxn],x,y,op[32][maxn];
int main()
if(x>n) n=x;
if((n/x)&1) sum^=y;
for(j=0;j<31&&(1
}for(i=0;i<31;i++)
}for(i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
XJTUOJ 1017 JM的完美集合
jm是強迫症晚期患者,他執著於集合的完美性,他認為,如果乙個集合中所有元素之和恰好為 0 那麼這個集合是完美的。給定乙個大小為 n 的可重複集合 a 判斷該集合存在多少個非空子集是完美的。可重複集合的意思是集合中可能有重複的元素,此時也可能存在多個相同的滿足條件的子集,要按照多個來算。第一行乙個正整...
114 國王遊戲
除第乙個人以外的每個人能獲得的獎賞為他之前所有人的左手乘積除以自己右手上的值 注意是之前的所有人不包括自己 通過改變順序使得獲得最多獎賞最小化。貪心策略 受到奶牛的雜技這題的影響,我們發現乘積越大的要往後放除的大的也要往後放,所以我們根據左手右手的乘積從小到大排序,然後以此計算取max即可,交了之後...
11 4 結構示例
下面各節將展示兩個關於使用struct型別的重要示例,它們將各自建立乙個型別,這兩個型別可以像c 語言的內建型別那樣使用,但它們分別具有修改了的語義。using system public struct dbint 如果dbint表示乙個未知的值,則isnull屬性為true。public bool...