[集训]FWT基础练习题
题意
给出n个长度为20的二进制数和数字k,每次询问给出一个二进制数,问从n个数中挑k个数(不能重复)的按位或能包含询问的组合有多少个。数字均小于等于5E5,1s。
思考
强行算出2^20个答案,再O(1)询问。
可知按位或的FWT能够将两个数组融合成新的数组。假设Fk表示挑出k个数字能组成的所有可能的桶,A为原始的桶数组,可知Fk[i]=(Fk-1 或运算FWT A)[i]-(k-1)Fk-1[i],后面减法的目的是减去数被重复选择的部分。
再观察FWT其实是线性变换,因此Fk[i]可以预先乘上k方便下一次计算。因此最开始只要乘上某个组合数即可。
最后根据按位与FWT可得到所有的答案。总复杂度O(nlogn)。
代码
#pragma GCC optimize 2
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long int ll;
const int maxn=1E6+5E5+;
const int LEN=;
const int G=<<LEN;
ll n,k,m,a[maxn],b[maxn],c[maxn],d[maxn];
ll fac[maxn],inv[maxn];
string str;
inline int get(string str)
{
int sum=;
for(int i=;i<LEN;++i)
sum=sum*+str[i]-'';
return sum;
}
ll qpow(ll x,ll y)
{
ll ans=,base=x;
while(y)
{
if(y&)
ans=ans*base%mod;
base=base*base%mod;
y>>=;
}
return ans;
}
void init()
{
fac[]=;
for(int i=;i<=;++i)
fac[i]=fac[i-]*i%mod;
inv[]=qpow(fac[],mod-);
for(int i=-;i>=;--i)
inv[i]=inv[i+]*(i+)%mod;
}
void FWT(ll*A,int t1,int t2)
{
for(int len=;len<=G;len<<=)
for(int i=;i<G/len;++i)
for(int j=;j<len/;++j)
{
ll a=A[i*len+j],b=A[i*len+j+len/];
A[i*len+j]=(a+b*t1)%mod;
A[i*len+j+len/]=(b+a*t2)%mod;
}
}
template<class T>void copy(T*a,T*b,int x)
{
for(int i=;i<x;++i)
a[i]=b[i];
}
int main()
{
ios::sync_with_stdio(false);
init();
cin>>n>>k>>m;
for(int i=;i<=n;++i)
{
cin>>str;
++a[get(str)];
}
copy(c,a,G);
FWT(a,,);
for(int i=;i<G;++i)
{
if(a[i]>=k)
a[i]=fac[a[i]]*inv[a[i]-k]%mod;
else
a[i]=;
}
FWT(a,,-);
/*
for(int i=2;i<=k;++i)
{
copy(d,a,G);
FWT(a,0,1);
copy(b,c,G);
FWT(b,0,1);
for(int j=0;j<G;++j)
a[j]=a[j]*b[j]%mod;
FWT(a,0,-1);
for(int j=0;j<G;++j)
a[j]=(a[j]-d[j]*(i-1)+mod)%mod;
}
*/
FWT(a,,);
while(m--)
{
cin>>str;
cout<<a[get(str)]*inv[k]%mod<<endl;
}
return ;
}
[集训]FWT基础练习题的更多相关文章
- Linux基础练习题(二)
Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...
- 珍藏的数据库SQL基础练习题答案
自己珍藏的数据库SQL基础练习题答案 一,基本表的定义与删除. 题1: 用SQL语句创建如下三张表:学生(Student),课程表(Course),和学生选课表(SC),这三张表的结构如表1-1到表1 ...
- Linux基础练习题之(四)
Linux基础练习题 请详细总结vim编辑器的使用并完成以下练习题 1.复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的 ...
- Python之基础练习题
Python之基础练习题 1.执行 Python 脚本的两种方式 2.简述位.字节的关系 解:8位是一个字节 3.简述 ascii.unicode.utf-8.gbk 的关系 4.请写出 “李杰” 分 ...
- shell基础练习题
shell 基础练习题 1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 #!/bin ...
- js基础练习题(1)
1.字符串 视频教程地址: js基础练习题 1.如何连接两个或者两个以上字符串? var cssname = 'box' var num = 1 var html = '<div class=& ...
- 【视频+图文】Java经典基础练习题(三):输入3个整数,并将其由小到大输出
目录 一.视频讲解 二.思路分析 总结: 三.代码+详解+结果 四.彩蛋 能解决题目的代码并不是一次就可以写好的 我们需要根据我们的思路写出后通过debug模式找到不足再进行更改 多次测试后才可得到能 ...
- python基础练习题(九九乘法表)
又把python捡起来了,动手能力偏弱,决定每日一练,把基础打好! ------------------------------------------------------------------ ...
- javaScript基础练习题-下拉框制作
1.基础回顾 如何让一个段javascript在文档加载后执行,(因为自己忘了,所以顺便复习一下) window.onload = function(){}; <!DOCTYPE html PU ...
随机推荐
- 2016湖南省赛 I Tree Intersection(线段树合并,树链剖分)
2016湖南省赛 I Tree Intersection(线段树合并,树链剖分) 传送门:https://ac.nowcoder.com/acm/contest/1112/I 题意: 给你一个n个结点 ...
- Mac-安装Git以及Git的配置
开始使用mac,发现真的不会用.最主要的是不熟悉,使用了才知道,mac默认是带了Git命令的. 原本使用Git生成一对密钥使用,生成的默认文件夹下面去了,与Windows一致,然后就找不到了. 打开命 ...
- javascript 闭包的理解(二)
// 定义一个User构造函数 function User(properties){ //遍历对象属性,确保它作用域正确 for(var i in properties){ (function(whi ...
- 在Linux CentOS下如何安装tar.gz和RPM软件包
1.安装tar.gz软件包: 在Linuxr(Centos下)如何安装tar.gz软件包,该方式实质上就是源代码安装方式,具体如下: 在Linux中使用wget命令下载要安装的文件,命令格式如下:wg ...
- 曹工杂谈--使用mybatis的同学,进来看看怎么在日志打印完整sql吧,在数据库可执行那种
前言 今天新年第一天,给大家拜个年,祝大家新的一年里,技术突突突,头发长长长! 咱们搞技术的,比较直接,那就开始吧.我给大家看看我demo工程的效果(代码下边会给大家的): 技术栈是mybatis/m ...
- 美国权威媒体CRN预测:2020年值得关注的10个新兴云计算趋势
云计算在过去一年里极速发展,其速度之快,让人难以预测未来会发生什么.即使依照这些趋势而新发明的技术在不断变化并且极其脆弱,而推动这些趋势和技术不断发展的企业和组织最终也很有可能发生变化,但不妨碍这些大 ...
- js获取当前农历时间
<template> <div class="gaia-header"> <img alt="gaia_logo" src=&qu ...
- C Primer Plus(二)
重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 分支和跳转 1.ctype.h头文件里包含了一些列用于字符判断的函数,包括判断数字.大 ...
- C#操作注册表(简单方便,兼容X32和X64)
C#操作注册表(简单方便,兼容X32和X64) 大家好,我在这里给大家介绍本人实现的操作注册表的类,简单方便,兼容32位系统和64位系统. 一般大家用C#操作注册的方法是使用命名空间Microsoft ...
- 导出 CVS
function ExportStoreInfoAction() { set_time_limit(0); $table = "xd_store"; $res = [[...].. ...