hihoCoder 1549 或運算和

2022-04-11 02:40:38 字數 2141 閱讀 3246

#1549 : 或運算和

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

給定n個數a1...an (0 <= ai < 220) 和乙個正整數k,我們用ans[i]表示有多少種從這n個數中選取k個數的方案,滿足這k個數的或運算和正好為i。

你能對於每乙個i(0 <= i < 220)都計算出ans[i]的值嗎?

為了簡化輸出,你只需要輸出σ(ans[i] * i) 除以1000000007的餘數。

第一行乙個數t(<=10),表示資料組數

對於每一組資料:

第一行兩個數n,k(1<=n<=100,000,k<=1000)

第二行n個數a1...an (0 <= ai < 220)

乙個數表示答案

樣例輸入

2

3 21 2 3

4 21 2 4 5

樣例輸出

9 31

//其實,若是理解了,很容易做出來

直接分析答案,

∑(ans[i] * i ) = ∑(ans[i] * (2p1+2p2+2p3+...+2px)) (pi 為互不相同的自然數)

= 20 * (ans[0]+ans[1]+...+ ans[220-1])

+21 * (ans[0]+ans[1]+...+ ans[220-1])

+...

+219 * (ans[0]+ans[1]+...+ ans[220-1])

然後,發現,(ans[0]+ans[1]+...+ ans[220-1])這部分,代表的意思是,n 個數中選 k 個數或出 0 -- 220-1 的種數。選 k 個數不管如何,或出來肯定在 0 - 220-1 之中,所以 2i * (ans[0]+ans[1]+...+ ans[220-1]) 就是 n 個數中,轉二進位制,第 i 位選 k 個或出 1 的種數,然後就簡單的排列組合,求逆元,累加即可。

或者簡單的撕拷,選 k 個數,組成了一種 i ,i 是由 (2p1+2p2+2p3+...+2px)組成,答案中就包含了這部分,所以,找到所有選 k 個數可以讓 x (0-19)位變為 1 的種數,再乘以權值,即為答案,其實這就是算貢獻,還得好好練啊!

1 # include 2 # include 3 # include 4 # include 5 # include 6 # include 7 # include 8 # include 9 # include 10 # include 

11 # include 12 # include 13

using

namespace

std;

14#define lowbit(x) ((x)&(-x))

15#define pi acos(-1.0)

16#define eps 1e-8

17#define mod 1000000007

18#define inf 0x3f3f3f3f

19#define ll long long

20 inline int

scan()

23while(ch>='

0'&&ch<='9')

24return x*f;25}

26 inline void out(int

a) 28

if(a>=10) out(a/10

);29 putchar(a%10+'0'

);30}31

#define mx 100005

32//

code begin...

33int

n,k;

34int

a[mx];

3536

ll qk_mi(ll x,ll y)

3745

return

res;46}

4748 ll c(ll x,ll y)//

m n

4963

64 ll slove(int x,int

y)65

7071

intmain()

7288 printf("

%lld\n

",ans);89}

90return0;

91 }

view code

HIHOCODER 1509 異或排序

給定乙個長度為 n 的非負整數序列 a 1.n 你需要求有多少個非負整數 s 滿足以下兩個條件 1 0 s 260 2 對於所有 1 i n 有 a i xor s a i 1 xor s 第一行乙個正整數 n 第二行 n 個非負整數表示序列 a 1.n 1 n 50 0 a i 260 乙個非負正...

hihocoder1693 逆序異或和

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 給定長度為n的序列a1,a2,an,求 其中xor是按位異或運算。第一行包含乙個整數n。第二行包含n個整數a1,a2,an。對於60 的資料,1 n 5000 對於100 的資料,1 n 100000,1 ai 100000 ...

hihoCoder挑戰賽28 A 異或排序

題目鏈結 題意 題解 每次找到相鄰兩個數的二進位制形式中 不同的最高位 顯然s在這一位必然是確定的 必須在這一位確定數字讓a i a i 1 至於更高位的,它們的數字是相同的,以及更低位的 它們都任意 因為要對於所有的i 1.n 1 都滿足要求 所以看看哪些位置最後是確定的 或者發生了牴觸 直接輸出...