题意

给出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基础练习题的更多相关文章

  1. Linux基础练习题(二)

    Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...

  2. 珍藏的数据库SQL基础练习题答案

    自己珍藏的数据库SQL基础练习题答案 一,基本表的定义与删除. 题1: 用SQL语句创建如下三张表:学生(Student),课程表(Course),和学生选课表(SC),这三张表的结构如表1-1到表1 ...

  3. Linux基础练习题之(四)

    Linux基础练习题 请详细总结vim编辑器的使用并完成以下练习题 1.复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的 ...

  4. Python之基础练习题

    Python之基础练习题 1.执行 Python 脚本的两种方式 2.简述位.字节的关系 解:8位是一个字节 3.简述 ascii.unicode.utf-8.gbk 的关系 4.请写出 “李杰” 分 ...

  5. shell基础练习题

    shell 基础练习题 1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 #!/bin ...

  6. js基础练习题(1)

    1.字符串 视频教程地址: js基础练习题 1.如何连接两个或者两个以上字符串? var cssname = 'box' var num = 1 var html = '<div class=& ...

  7. 【视频+图文】Java经典基础练习题(三):输入3个整数,并将其由小到大输出

    目录 一.视频讲解 二.思路分析 总结: 三.代码+详解+结果 四.彩蛋 能解决题目的代码并不是一次就可以写好的 我们需要根据我们的思路写出后通过debug模式找到不足再进行更改 多次测试后才可得到能 ...

  8. python基础练习题(九九乘法表)

    又把python捡起来了,动手能力偏弱,决定每日一练,把基础打好! ------------------------------------------------------------------ ...

  9. javaScript基础练习题-下拉框制作

    1.基础回顾 如何让一个段javascript在文档加载后执行,(因为自己忘了,所以顺便复习一下) window.onload = function(){}; <!DOCTYPE html PU ...

随机推荐

  1. Servlet 常用类

    Servlet 是一套标准的接口规范,当用户通过web请求来访问服务器时,由web容器根据配置调用我们实现的对应的servlet对象来提供服务.同时为了方便开发,servlet标准中也提供了许多常用的 ...

  2. 【Docker】镜像分层存储与镜像精简

    Linux操作系统 Linux操作系统由内核空间和用户空间组成. 内核空间是kernel,用户空间是rootfs, 不同Linux发行版的区别主要是rootfs.比如 Ubuntu 14.04 使用 ...

  3. selenium模块的基本使用

    一.selenium库与requests库的区别 - selenium请求库: - 本质上是一个自动化测试模块; ---> 主要用于测试 UI界面 - selenium除了可以做自动化测试,还可 ...

  4. 洛谷P1002 过河卒 题解 动态规划

    题目链接:https://www.luogu.com.cn/problem/P1002 题目大意 棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点.卒行走的规则:可以向下.或者向右.同时在棋盘 ...

  5. 「洛谷P1198」 [JSOI2008]最大数 解题报告

    P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...

  6. Java 从入门到进阶之路(二十一)

    在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection. 早在 Java 2 中之前,Java 就提供了特设类.比如:Dictionary, ...

  7. 网络爬虫简单介绍(python)

    一.简介 爬虫就是利用代码大量的将网页前端代码下载下来使用的一种程序,一般来说常见的目的为下: 1.商业分析使用:很多大数据公司都会从利用爬虫来进行数据分析与处理,比如说要了解广州当地二手房的均价走势 ...

  8. mysql索引最佳实践

    索引最佳实践使用的表CREATE TABLE `employees` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(24) NOT ...

  9. 关于javaweb开发的环境搭建(一)Tomcat

    进行Tomcat的下载及环境配置 1.下载地址   http://tomcat.apache.org/ 2.下载的注意事项   下载的Tomcat版本要与自身电脑安装的java版本相匹配,下载时,点击 ...

  10. Spring Boot 集成 Seata 解决分布式事务问题

    seata 简介 Seata 是 阿里巴巴2019年开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务.在 Seata 开源之前,Seata 对应的内部版本在阿里内部一 ...