題意:在乙個陣列中任取三個數的異或和之和。
異或:二進位制下相同為0,不同為1。如:
0 ^ 1 = 1, 0 ^ 1 = 1, 1 ^ 1 = 0, 0 ^ 0 = 0。
在任取三個數中,只有兩種情況的異或為1:1 1 1 和 0 0 1
所以一開始就要用乙個異或陣列來記錄每個數二進位制下的1的個數。
當在所有1 1 1的情況下有c(xor[i], 3)種,所有的1裡任取3個;在所有0 0 1的情況下有c(n - xor[i], 2) * xor[i])種,所有的0裡人任取2個在和任意乙個1組合。for
(int i =
0;i < n; i++
)}
由於處理組合數時,分子分母很大,需要用到費馬小定理
#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推薦好友,似乎華華還沒有瀏覽過。月月頓時醋意大發,出於對好朋友的關心,為了避免華華浪費太多時間和其他聊天,她要刪掉一些推薦好友。但是為了不讓華華發現,產生猜疑,破壞了他們...