二進位制亂搞 Luogu3917 異或序列

2021-08-06 06:56:00 字數 1441 閱讀 5880

題面:luogu3917

我的做法好像比較傻。。。

看到這種題首先想到字首。首先字首xor是不是很資辭?

我的做法呢就是先把所有數按二進位制位拆開,然後每一位都做兩次字首。

首先對數字做一次字首xor,記到

s 陣列裡,再對s陣列做一次字首和,記到ss

裡。 然後我們可以對於每一位列舉起始位置i,然後從i開始向後到n統計答案。

首先考慮到

s 陣列非0即1,所以這裡處理將會非常方便。

我們可以看到

s陣列和ss

陣列的關係就像這樣(這裡的」^」都是xor的意思):

可以發現ss

[i] 就對應了以s[i]為底的三角形是不是?

所以首先我們差分求出∑n

j=is

j 之後我們得到了乙個等腰梯形(以3~5為例):

我們發現最前面兩個是一樣的,所以我們把這個作為公共部分。而且我們要求答案的也是這個梯形減掉左邊的公共部分。

我們發現如果公共部分的xor值為1的話,右邊的答案就需要整體翻轉一下,如果為0,就不變。

這樣我們就o(

1)得到了從i開始的所有答案。

最後乘上當前在第幾位的底數就好了。時間複雜度o(

nlog

n)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int a[100010],s[100010][32],s[100010][32],n;

inline

long

long cal(int l,int x)

int main()

for(int i=1;i<=n;i++)

for(int j=0;j<32;j++)s[i][j]=s[i-1][j]+s[i][j];//第二次字首和

long

long ans=0;

for(int i=1;i<=n;i++)

for(int k=0;k<32;k++)ans+=cal(i,k);

printf("%lld",ans);

return

0;}

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...

mysql二進位制 MySql二進位制連線方式詳解

使用mysql二進位制方式連線 您可以使用mysql二進位制方式進入到mysql命令提示符下來連線mysql資料庫。例項以下是從命令列中連線mysql伺服器的簡單例項 root host mysql u root p enter password 在登入成功後會出現 mysql 命令提示視窗,你可以...