校慶志願者小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。乙個整數表示答案。輸...