NOIP2017提高A組集訓10 22 幸運值

2021-10-16 09:16:48 字數 1744 閱讀 5680

校慶志願者小z在休息時間和同學們玩卡牌遊戲。一共有n張卡牌,每張卡牌上有乙個數ai,每次可以從中選出k張卡牌。一種選取方案的幸運值為這k張卡牌上數的異或和。小z想知道所有選取方案的幸運值之和除以998244353的餘數。

對於30

%30\%

30%的資料滿足,1≤n

≤20

1\le n\le20

1≤n≤20

對於另30

%30\%

30%的資料滿足,1≤n

≤100

1\le n\le 100

1≤n≤10

0,0

≤1024

00​≤10

24對於80

%80\%

80%的資料滿足,1≤n

≤2000

1\le n\le2000

1≤n≤20

00對於100

%100\%

100%

的資料滿足,1≤n

≤100000,0

<231

,1≤k

≤n

1\le n\le100000,01≤

n≤10

0000

,0​<23

1,1≤

k≤n給出n

nn個數,在其中選k

kk個數求異或和,問所有情況異或和的總和模998244353的結果

異或的套路一般都是按位來處理,這題也是。求出每個位置上為1有多少個數,然後根據組合數得出公式(設當前位置j

jj上1的個數是xxx)

a ns

=∑i=

1min

(k,x

)(xi

)(n−

xk−i

)2

jans=\sum_^\beginx\\i\end\beginn-x\\k-i\end2^j

ans=∑i

=1mi

n(k,

x)​(

xi​)

(n−x

k−i​

)2j解釋:

首先一定要保證i

ii是奇數,因為只有是奇數當前位置才能有值。那麼可以在當前位置是1的x

xx的位置中選擇i

ii個,方案cxi

c_x^i

cxi​

然後在剩下的n−x

n-xn−

x個當前位置為0的數中選取k−i

k-ik−

i個,方案為cn−

xk−i

c_^cn

−xk−

i​最後乘上當前位置的值2

j2^j

2j即可

#include

#define ll long long

#define p 998244353

using

namespace std;

ll ans,n,k,x,a[

150000

],jc[

150000];

ll ksm

(ll x,ll y)

return res;

}ll c

(ll x,ll y)

intmain()

printf

("%lld\n"

,ans)

;fclose

(stdin);

fclose

(stdout);

return0;

}

NOIP2017提高A組集訓10 21 總結

今天和學軍 雅禮的dalao們一起切磋,感覺他們太強了。接到題目 t1 一定存在著什麼規律。於是我後來打了個表找了一下規律 顯然 部分大佬們想到t1的部分分的dp 強 t2 一看就知道很可能是dp。我dp很爛,所以先打30分暴力再說。打完之後去想60分。我又根據暴力發現了在遞增序列裡,剩下的後面的數...

NOIP2017提高A組集訓10 30 總結

今天幹了些什麼 看到第一題,我蒙b了 感覺這題之前在 見過,記得好像是將圖斜過來看還是怎樣的。於是去看第二題。第二題乙個很顯然的做法,將邊排序,然後暴力建mst。然而我將時間複雜度多算了乙個0,以為不能過,結果我多加了乙個用來騙分的東西,結果這個騙分的東西打錯了,要騙分的那兩個資料都沒過。55555...

NOIP2017提高A組集訓10 22 幸運值

校慶志願者小z在休息時間和同學們玩卡牌遊戲。一共有n張卡牌,每張卡牌上有乙個數ai,每次可以從中選出k張卡牌。一種選取方案的幸運值為這k張卡牌上數的異或和。小z想知道所有選取方案的幸運值之和除以998244353的餘數。輸入的第一行有兩個整數n和k。第二行有n個整數,表示序列a。乙個整數表示答案。輸...