牛客國慶集訓派對Day4 B 異或求和 按位統計

2022-04-02 14:22:57 字數 2058 閱讀 4773

題目鏈結

刷牛客一戰到底做到的,感覺還挺有趣...

求給定\(n\)及序列\(a_i\),求$$\sum_(a_i\oplus a_j)(a_j\oplus a_k)(a_i\oplus a_k)$$

\(n\leq10^5,\ a_i\leq10^9\)。

首先有乙個\(o(n\log^2n)\)的做法,**這裡有,看來是跑不過去..(不知道提交記錄裡有沒有過的)

來自國慶正睿dls課件。

能跑過的做法:

注意,口胡的,不保證正確性= =(但是演算法是對的)(沒辦法啊找不到題解,還比較趕時間...)

當然還是想拆開乘法按位統計。

考慮列舉每乙個異或結果\(2^x\)的貢獻:$$ans=\sum_\sum_\sum_2\times ?$$

乘上多少呢?現在我們需要統計\(a_i\oplus a_j\)在第\(i\)為\(1\),且\(a_j\oplus a_k\)在第\(j\)位為\(1\),且\(a_k\oplus a_i\)在第\(k\)位為\(1\)的方案數(不要弄混...\(a_i\)中的\(i\)就是下標,外面的\(i\)是列舉的\(2^i\))。

考慮列舉\(a_i\)第\(i\)位是\(0\)還是\(1\),設為\(a\),那麼\(a_j\)的第\(i\)位是\(a\oplus1\);同理列舉\(a_j\)的第\(j\)位是\(b\),那麼\(a_k\)的第\(j\)位是\(b\oplus1\);同理列舉\(a_k\)的第\(k\)位的\(c\),那麼\(a_i\)的第\(k\)位是\(c\oplus1\)。(這麼打累死我了...)

那麼合法的\(a_i\)就是,第\(i\)位為\(a\)且第\(k\)位為\(c\oplus1\)的數字,\(a_j,a_k\)同理...

所以記\(cnt[i][j][a][b]\)表示第\(i\)位為\(a\),第\(j\)位為\(b\)的\(a_x\)有多少個,乘起來就ok了。

預處理\(cnt\)的複雜度是\(o(n\log^2n)\),常數很小。最後求和的複雜度是\(o(2^3\log^3n)\)。

答案最後除個\(6\)。

//97ms	1892kb

#include #include #include #include //#define gc() getchar()

#define mod 998244353

#define inv6 166374059

#define maxin 500000

#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)

typedef long long ll;

const int n=31;

int cnt[n][n][2][2],pw[n<<2];

char in[maxin],*ss=in,*tt=in;

inline int read()

inline int calc(int i,int j,int x,int y)

int main()

pw[0]=1;

for(int i=1; i<90; ++i) pw[i]=pw[i-1]<<1, pw[i]>=mod&&(pw[i]-=mod);

ll ans=0;

for(int i=0; i

for(int j=0; j

for(int k=0; k

for(int a=0; a<2; ++a)

for(int b=0; b<2; ++b)

for(int c=0; c<2; ++c)

ans+=1ll*pw[i+j+k]*calc(i,k,a,c^1)%mod*calc(i,j,a^1,b)%mod*calc(j,k,b^1,c)%mod;

printf("%lld\n",ans%mod*inv6%mod);

return 0;

}

牛客國慶集訓派對Day4

a 把b n include include include includeusing namespace std int main d 由於是個完全圖,選擇乙個權值最小的點,其他所有的點向它連線就行了。注意點為1的時候輸出0 include include include includeusing...

牛客國慶集訓派對Day4 G I H

小 bo 有 n 個正整數 a1.an,以及乙個權值序列 w1 wn,現在他定義 現在他想知道 你只需要輸出答案對 109 7 取模後的值 第一行乙個正整數 n 第二行 n 個正整數 a1.an 第三行 n 個正整數 w1.wn 輸出答案對 109 7 取模後的值示例1 複製3 1 1 1 1 1 ...

2020牛客國慶集訓派對day4 補題

2020牛客國慶集訓派對day4 b 題意 題意 求最長等差序列的長度。dp 攤派了我講不明白,參考下這兩篇部落格吧 捂臉 傳送門1 傳送門2 include include include include include include include using namespace std ty...