牛客小白月賽25 J異或和之和 位運算與組合計數

2021-10-06 08:37:59 字數 1208 閱讀 9005

題意:在乙個陣列中任取三個數的異或和之和。

異或:二進位制下相同為0,不同為1。如:

0 ^ 1 = 1, 0 ^ 1 = 1, 1 ^ 1 = 0, 0 ^ 0 = 0。

在任取三個數中,只有兩種情況的異或為1:1 1 1 和 0 0 1

所以一開始就要用乙個異或陣列來記錄每個數二進位制下的1的個數。

for

(int i =

0;i < n; i++

)}

當在所有1 1 1的情況下有c(xor[i], 3)種,所有的1裡任取3個;在所有0 0 1的情況下有c(n - xor[i], 2) * xor[i])種,所有的0裡人任取2個在和任意乙個1組合。

由於處理組合數時,分子分母很大,需要用到費馬小定理

#include 

using

namespace std;

typedef long

long ll;

typedef long

double ld;

#define inf 0x7f7f7f

#define mem(a,b) memset(a , b , sizeof(a))

#define for(i, x, n) for(int i = x;i <= n; i++)

const ll mod =

1e9 +7;

// const int maxn = 100005;

ll fpm

(ll a, ll b)

a = a * a % mod;

b >

>=1;

}return ans % mod;

}ll c

(ll n, ll m)

return ans % mod;

}ll xor[64]

;void

solve()

} ll sum =0;

ll k =1;

for(ll i =

0;i <

64; i++

) cout <

< sum % mod;

}signed main()

牛客小白月賽25 J 異或和之和

題目鏈結 給乙個陣列,陣列內有 個正整數。求這些數任取3個數異或運算後求和的值。也就是說,取一共 cn3 c cn 3 個三元組,計算這些三元組內部異或,之後求和。具體操作可以見樣例描述 由於該值可能過大,輸出其對 109 7 10 9 7 109 7 取模的值。第一行乙個正整數 接下來有 個正整數...

牛客小白月賽25

分情況討論 include using namespace std const int n 2e5 5 typedef long long ll int a n int main void if n x else printf lld n ans return0 用字元陣列來模擬棧 include ...

牛客小白月賽12 392J

月月和華華一起去吃飯了。期間華華有事出去了一會兒,沒有帶手機。月月出於人類最單純的好奇心,開啟了華華的手機。哇,她看到了一片的qq推薦好友,似乎華華還沒有瀏覽過。月月頓時醋意大發,出於對好朋友的關心,為了避免華華浪費太多時間和其他聊天,她要刪掉一些推薦好友。但是為了不讓華華發現,產生猜疑,破壞了他們...