JZOJ 5414. 【NOIP2017提高A组集训10.22】幸运值
2017-10-23 15:49
549 查看
Description
校庆志愿者小Z在休息时间和同学们玩卡牌游戏。一共有n张卡牌,每张卡牌上有一个数Ai,每次可以从中选出k张卡牌。一种选取方案的幸运值为这k张卡牌上数的异或和。小Z想知道所有选取方案的幸运值之和除以998244353的余数。Input
输入的第一行有两个整数n和k。第二行有n个整数,表示序列A。
Output
一个整数表示答案。Sample Input
输入1:
3 21 2 3
输入2:
10 5123 456 789 987 654 321 101 202 303 404
Sample Output
输出1:
6输出2:
130776Data Constraint
对于30%的数据满足,1<=n<=20对于另30%的数据满足,1<=n<=100,0
Hint
样例1幸运值之和为(1 ⊕ 2) + (1 ⊕ 3) + (2 ⊕ 3) = 6Solution
我们发现每一位的答案与选了哪些数无关,而与哪一位的0、1数量有关。于是我们统计出这 N 个数的每一位的0、1数。
对于每一位,我们设有 x 个 1 ,那么则有 n−x 个 0 。
要在其中选 k 个数,又发现其异或和只与 1 的个数的奇偶性有关。
那么这一位的答案即为:∑j=1,j≡1(mod 2)xCjx∗Ck−jn−x
即选一些数作为1、另一些数作为0的组合数。
注意特判 Cyx 中当 x<y 时返回 0 。
时间复杂度为 N log Ai 。
Code
#include<cstdio> #include<cmath> using namespace std; const int N=1e5+1,mo=998244353; int mx; long long ans; int f[31]; long long g ,h ; inline int read() { int X=0,w=1; char ch=0; while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();} while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar(); return X*w; } inline long long ksm(long long x,int y) { long long s=1; while(y) { if(y&1) s=s*x%mo; x=x*x%mo; y>>=1; } return s; } inline long long C(int x,int y) { if(x<y) return 0; return g[x]*h[x-y]%mo*h[y]%mo; } int main() { int n=read(),k=read(); for(int i=1;i<=n;i++) { int x=read(),y=log2(x); if(y>mx) mx=y; for(int j=0;j<=y;j++) f[j]+=x&1,x>>=1; } long long p=g[0]=h[0]=1; for(int i=1;i<=n;i++) g[i]=g[i-1]*i%mo; h =ksm(g ,mo-2); for(int i=n-1;i;i--) h[i]=h[i+1]*(i+1)%mo; for(int i=0;i<=mx;i++,p<<=1) for(int j=1,q=f[i]<k?f[i]:k;j<=q;j+=2) ans=(ans+C(n-f[i],k-j)*C(f[i],j)%mo*p%mo)%mo; printf("%lld",ans); return 0; }
相关文章推荐
- 【JZOJ 5414】【NOIP2017提高A组集训10.22】幸运值
- JZOJ5414. 【NOIP2017提高A组集训10.22】幸运值
- 5414. 【NOIP2017提高A组集训10.22】幸运值
- [JZOJ5411]【NOIP2017提高A组集训10.22】友谊
- JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
- 【JZOJ5415】【NOIP2017提高A组集训10.22】[斜率优化]公交运输
- 【JZOJ5410】【NOIP2017提高A组集训10.22】小型耀斑
- 【JZOJ 5415】【NOIP2017提高A组集训10.22】公交运输
- 【JZOJ 5416】【NOIP2017提高A组集训10.22】密码
- 【JZOJ 5410】【NOIP2017提高A组集训10.22】小型耀斑
- [JZOJ5413]【NOIP2017提高A组集训10.22】清兰
- JZOJ5415. 【NOIP2017提高A组集训10.22】公交运输 DP
- 【JZOJ5411】【NOIP2017提高A组集训10.22】友谊
- [JZOJ5410]【NOIP2017提高A组集训10.22】小型耀斑 (口胡)
- JZOJ5415. 【NOIP2017提高A组集训10.22】公交运输
- 【JZOJ 5413】【NOIP2017提高A组集训10.22】清兰
- 【JZOJ 5411】【NOIP2017提高A组集训10.22】友谊
- JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输
- [JZOJ5415]【NOIP2017提高A组集训10.22】公交运输
- 【JZOJ5413】【NOIP2017提高A组集训10.22】清兰