hihoCoder 1549 或运算和
#1549 : 或运算和
描述
给定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 或运算和的更多相关文章
- hihoCoder 1513 : 小Hi的烦恼 位运算好题
思路:考虑第i个同学,第一门课排名比他靠前的同学的集合是S1,第二门课是S2...第五门课是S5,很明显比这个同学每门课程都优秀的同学就是S1&S2&S3&S4&S5, ...
- hihoCoder.1509.异或排序(位运算 思路)
题目链接 \(Description\) 给定长为\(n\)的序列\(A\).求有多少\(S\),满足\(0\leq S<2^{60}\),且对于所有\(i\in[1,n-1]\),\(a[i] ...
- ACM学习历程—Hihocoder 1178 计数(位运算 && set容器)(hihoCoder挑战赛12)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Rowdark是一个邪恶的魔法师.在他阅读大巫术师Lich的传记时,他发现一类黑魔法来召唤远古生物,鱼丸. 魔法n能召 ...
- [HIHO]hihoCoder太阁最新面经算法竞赛7
题目链接:http://hihocoder.com/contest/hihointerview12 期末完事了,终于有时间成套刷题了.这套题比较简单,难度上感觉和上一套差不多.除了最后一个题是看了讨论 ...
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- hihocoder 1334 - Word Construction - [hiho一下第170周][状态压缩+DFS]
题目链接:https://hihocoder.com/problemset/problem/1334 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N wo ...
- 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】
hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个 ...
- hihocoder #1419 : 后缀数组四·重复旋律4
#1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...
- 骨牌覆盖问题总结!hihoCoder/ NYOJ-1273宣传墙1151
本想着做一下第九届河南省省赛题,结果被这个类似骨牌覆盖的题卡住了,队友然我去hihoCoder上老老实实把骨牌覆盖一.二.三做完,这题就没什么问题了.虽然很不情愿,但还是去见识了一下. 骨牌覆盖问题 ...
随机推荐
- linux ps 命令的结果中VSZ,RSS,STAT的含义和大小
linux ps 命令的结果中VSZ,RSS,STAT的含义和大小 ps是linux系统的进程管理工具,相当于windows中的资源管理器的一部分功能. 一般来说,ps aux命令执行结果的几个列的信 ...
- 微信小程序 - 表单验证插件WxValidate(自定义警告信息形式)
弹出的形式对于用户来说,总是不太友好的 可能会出现层级问题(只需要设置一下提示的层级即可) WxValidate内置规则 以下代码拷贝即可使用~ wxml <form bindsubmit='s ...
- vue 表单验证实例
1.注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- vue scoped 解决样式不生效问题
对于添加样式不能影响子组件样式的情况使用:>>> <style scoped> .sti-inline{ display: inline; } .sti-searchfo ...
- matlab经常使用小函数(一)
(第1维为对每一列操作.第2维维对每一行操作) sum 求和操作 max 求最大值操作 sum:求和操作 sum(A):矩阵A按列向求和(每一列求和).结果为一个行向量 sum(A,2):矩阵 ...
- Spring集成Jersey开发(附demo)
下文将会初步介绍如何在Spring中集成Jersey,并附简单的demo 所依赖的技术版本: Jersey 1.8 Spring 3.0.5.RELEASE 1. 项目依赖 pom.xml定义(注意去 ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(六)—— 简单过滤器的使用
有些同学喜欢在测试或运行项目时,直接跳转页面到Home/Index下,但本次项目直接输入Home/Index则会报错 因为home/index中有个user.name参数,如果启动项目后直接跳转到ho ...
- LVM详解笔记pv-vg-lv创建和扩展
LVM Logical Volume Manager(逻辑卷管理) 是Linux环境下对底层磁盘的一种管理机制(方式),处在物理磁盘和文件系统之间. 名词: PV (Physical Volume)物 ...
- Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27
Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...
- Atitit.一些公司的开源项目 重大知名开源项目attilax总结
Atitit.一些公司的开源项目 重大知名开源项目attilax总结 1. Twitter--Bootstrap:1 2. Google2 2.1. Gson2 2.2. Angular.Js2 2. ...