#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 2
1 2 3
4 2
1 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 的种数,再乘以权值,即为答案,其实这就是算贡献,还得好好练啊!

 # include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <bitset>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
#define lowbit(x) ((x)&(-x))
#define pi acos(-1.0)
#define eps 1e-8
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define LL long long
inline int Scan() {
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
}
inline void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
#define MX 100005
//Code begin...
int n,k;
int a[MX]; LL qk_mi(LL x,LL y)
{
LL res = ;
while (y)
{
if (y&) res = res*x%MOD;
x = x*x%MOD;
y/=;
}
return res;
} LL C(LL x,LL y)// m n
{
if (x>y) return 0LL;
LL res =;
for (int i=;i<=y;i++)
res = (res*i)%MOD;
LL mj = ,mnj = ;
for (int i=;i<=x;i++)
mj = (mj*i)%MOD;
for (int i=;i<=(y-x);i++)
mnj = (mnj*i)%MOD;
mj = qk_mi(mj,MOD-); mnj = qk_mi(mnj,MOD-);
res = (res*mj%MOD) * mnj %MOD;
return res;
} LL slove(int x,int y)
{
LL res = C(k,x+y);
res = (res +MOD -C(k,x))%MOD;
return res;
} int main()
{
int T=Scan();
while(T--)
{
n = Scan();k = Scan();
for (int i=;i<n;i++)
a[i] = Scan();
LL ans = ;
for (int i=;i<;i++)
{
int zero=,one=;
for (int j=;j<n;j++)
if ((a[j]>>i)&) one++;
else zero++;
ans = (ans + (1LL<<i)*slove(zero,one)%MOD )%MOD;
}
printf("%lld\n",ans);
}
return ;
}

hihoCoder 1549 或运算和的更多相关文章

  1. hihoCoder 1513 : 小Hi的烦恼 位运算好题

    思路:考虑第i个同学,第一门课排名比他靠前的同学的集合是S1,第二门课是S2...第五门课是S5,很明显比这个同学每门课程都优秀的同学就是S1&S2&S3&S4&S5, ...

  2. hihoCoder.1509.异或排序(位运算 思路)

    题目链接 \(Description\) 给定长为\(n\)的序列\(A\).求有多少\(S\),满足\(0\leq S<2^{60}\),且对于所有\(i\in[1,n-1]\),\(a[i] ...

  3. ACM学习历程—Hihocoder 1178 计数(位运算 && set容器)(hihoCoder挑战赛12)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 Rowdark是一个邪恶的魔法师.在他阅读大巫术师Lich的传记时,他发现一类黑魔法来召唤远古生物,鱼丸. 魔法n能召 ...

  4. [HIHO]hihoCoder太阁最新面经算法竞赛7

    题目链接:http://hihocoder.com/contest/hihointerview12 期末完事了,终于有时间成套刷题了.这套题比较简单,难度上感觉和上一套差不多.除了最后一个题是看了讨论 ...

  5. [hihocoder 1033]交错和 数位dp/记忆化搜索

    #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...

  6. hihocoder 1334 - Word Construction - [hiho一下第170周][状态压缩+DFS]

    题目链接:https://hihocoder.com/problemset/problem/1334 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N wo ...

  7. 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】

    hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个 ...

  8. hihocoder #1419 : 后缀数组四·重复旋律4

    #1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...

  9. 骨牌覆盖问题总结!hihoCoder/ NYOJ-1273宣传墙1151

    本想着做一下第九届河南省省赛题,结果被这个类似骨牌覆盖的题卡住了,队友然我去hihoCoder上老老实实把骨牌覆盖一.二.三做完,这题就没什么问题了.虽然很不情愿,但还是去见识了一下.  骨牌覆盖问题 ...

随机推荐

  1. Unity 导出切片精灵

    http://blog.csdn.net/akof1314/article/details/38845933 设有一张png/tga图集,导入到Unity,放置目录"Assets/Resou ...

  2. EJB学习笔记之十(BMT事务和CMT事务)

     1.前言 前两篇博客主要介绍了与事务相关的知识.比如事务的一些特性,以及并发产生的问题.本篇来解说一下EJB中两种处理事务的方式.一种是以生命式方式来管理事务(CMT):还有一种则是在EJB内部使用 ...

  3. 关于窗体跟随与 PointToScreen

    今日写一段测试代码,实现的功能是,当一个输入框获得焦点时,某个帮助窗体跟随在其下方显示.代码很简单,本来没有什么值得一提的.但实验的时候发现,有些控件能较好地跟随,但有些不能,而且距离十分远. 主要代 ...

  4. 一个下载git库代码的脚本

    由于每日构建需求, 须要用脚本下载代码, 实现自己主动化编译, 这个脚本是整个系统的一小块功能 #!/bin/bash #@author Liuyang #@date 2015-06-23 funct ...

  5. shell exec命令执行shell打印输出到一个文件

    [root@master ~]# .sh #!/bin/bash exec >> /tmp/.log >>/tmp/.log date ldkkdfkslfds date [r ...

  6. MySQL学习总结(五)表数据查询

    查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高.最重要的数据操作. 1.单表数据记录查询 1.1.简单数据查询 SELECT field ...

  7. table行编辑

    一个简单的Demo <html> <head> <title>Table Test Demo</title> <style> .view_t ...

  8. php模板原理PHP模板引擎smarty模板原理浅谈

    mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...

  9. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url u ...

  10. Mysql数据库分库备份,分表备份

    分库备份 #!/bin/sh DBPATH=/server/backup MYUSER=root MYPASS=oldboy123 SOCKET=/data/3306/mysql.sock MYCMD ...