傳送門
思路:考慮每位對答案的貢獻,因為最大為2
182^
218,所以最大一共64位。
儲存每乙個1的個數,貢獻產生只能出現兩種情況
p os
1:
pos1:
pos1
:乙個1,兩個0.
p os
2:
pos2:
pos2
:三個1。
然後用組合數和加法原理對貢獻求和即可。
即第i
ii位的貢獻ans
i=c(
a[i]
,3)+
c(n−
a[i]
,2)×
a[i]
ans_i=c(a[i],3)+c(n-a[i],2)\times a[i]
ansi=
c(a[
i],3
)+c(
n−a[
i],2
)×a[
i] ps:
ps:ps
:計算組合數除法時需要用到逆元。
ac**:
#include
using
namespace std;
typedef
long
long ll;
const
int n=
2e5+
5,mod=
1e9+7;
int a[
100]
;ll ksm
(ll a,ll n)
return ans;
}ll inv
(ll x)
ll f
(ll x,ll y)
intmain()
} ll ans=0;
for(
int i=
0;i<
64;i++
)printf
("%lld\n"
,ans)
;return0;
}
異或和之和 異或問題
題目 有n個數,任選3個進行異或,求出所有三元組的異或和的和 普通計算是 o n 3 但是發現,對於異或的運算,就轉換為二進位制的運算,把每乙個陣列轉換為二進位制,再拆分,當且僅當 1 1 1 和 1 0 0 時,答案才為1,否則都是0,也就是說,只有這兩個情況是由貢獻的 把每個數位化為二進位制,然...
異或和之和
異或和之和 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 給乙個陣列,陣列內有 個正整數。求這些數任取3個數異或運算後求和的值。有幾個個三元組,計算這些三元組內部異或,之後求和。具體操作可以見樣例描述...
Vijos 連續數之和 組合數學
描述 有n個正整數排成一行。你的目的是要從中取出乙個或連續的若干個數,使它們的和能夠被k整除。例如,有6個正整數,它們依次為1 2 6 3 7 4。若k 3,則你可以取出1 2 6,或者2 6 3 7,也可以僅僅取出乙個6或者3使你所取的數之和能被3整除。當然,滿足要求的取法不止以上這4種。事實上,...