题目链接:点击查看

题目大意:规定一张试卷上有 mmm 个问题,每个问题只有 A,BA,BA,B 两个选项,现在给出 nnn 张试卷。需要选择一个问题的子集,使得有大于等于 kkk 对试卷的答案是不完全相同的,问这样的子集有多少个

题目分析:若将选项转换为 000 或 111,试卷视为 010101 串,那么两个试卷相同,当且仅当异或和等于 000。

设 aia_iai​ 为第 iii 个试卷所代表的 010101 串, F(S)F(S)F(S) 为异或和等于 SSS 的 010101 串对的个数,则

F(S)=∑i=1n∑j=in[ai⊕aj=S]F(S)=\sum\limits_{i=1}^{n}\sum\limits_{j=i}^{n}{[a_i\oplus a_j=S]}F(S)=i=1∑n​j=i∑n​[ai​⊕aj​=S]

不难发现可以转换为卷积的形式,设 num[x]num[x]num[x] 为 xxx 的出现次数,则

F(S)=12∑i⊕j=Snum[i]∗num[j]F(S)=\frac{1}{2}\sum\limits_{i\oplus j=S}num[i]*num[j]F(S)=21​i⊕j=S∑​num[i]∗num[j]

设 G(T)G(T)G(T) 为问题集合为 TTT 时,有多少对试卷是不相同的,则

G(T)=∑T∩S≠∅F(S)G(T)=\sum\limits_{T\cap S\neq \varnothing}F(S)G(T)=T∩S​=∅∑​F(S)

容斥一下

G(T)=n22−∑T∩S=∅F(S)=n22−∑S⊂(U−T)F(S)G(T)=\frac{n^2}{2}-\sum\limits_{T\cap S= \varnothing}F(S)=\frac{n^2}{2}-\sum\limits_{S\subset (U-T)}F(S)G(T)=2n2​−T∩S=∅∑​F(S)=2n2​−S⊂(U−T)∑​F(S)

可能有些同学会有疑问,为什么这里突然出来一个 n22\frac{n^2}{2}2n2​,因为根据 F(S)F(S)F(S) 的定义,F(S)F(S)F(S) 的最大值是这个数,所以设置为 FFF 函数的“全集”。

然后 UUU 是全集,U−TU-TU−T 自然也就是 TTT 的补集。

到此公式就推完了,F(S)F(S)F(S) 可以用 FWTFWTFWT 快速求解,G(T)G(T)G(T) 可以用 SOSdpSOSdpSOSdp 快速求解

代码:

// Problem: United in Stormwind
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/18713/M
// Memory Limit: 2097152 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=5e6+100;
char s[N];
double F[N];
LL G[N];
void FWTxor(double *f,double x,int len)
{for(int mid=1;(mid<<1)<=len;mid<<=1){int R=mid<<1;for(int i=0;i<len;i+=R)for(int j=0;j<mid;j++){f[i+j]=f[i+j]+f[i+j+mid];f[i+j+mid]=f[i+j]-f[i+j+mid]-f[i+j+mid];f[i+j]=f[i+j]*x;f[i+j+mid]=f[i+j+mid]*x;}}
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;LL k;read(n),read(m),read(k);for(int i=1;i<=n;i++) {scanf("%s",s);int state=0;for(int j=0;j<m;j++) {if(s[j]=='A') {state|=(1<<j);}}F[state]+=1.0;}FWTxor(F,1,1<<m);for(int i=0;i<1<<m;i++) {F[i]*=F[i];}FWTxor(F,0.5,1<<m);for(int i=0;i<1<<m;i++) {G[i]=LL(F[i]/2);}for(int j=0;j<m;j++) {for(int i=0;i<1<<m;i++) {if(i>>j&1) {G[i]+=G[i^(1<<j)];}}}int ans=0;for(int i=0;i<1<<m;i++) {if(1LL*n*n-G[i]*2>=k*2) {ans++;}}cout<<ans<<endl;return 0;
}

2020ICPC沈阳 - United in Stormwind(推公式+FWT+SOSdp)相关推荐

  1. ICPC 沈阳M - United in Stormwind SOSDP+FWT+容斥

    题意: 题意是真的难懂,求题目集(0~1<<m)中满足>=k对不同的试卷,两张试卷不同当且仅当至少存在一位不同,而且该位在题目集里. n<=2e5 m<=20 思路: 我 ...

  2. 2020 区域赛(沈阳) M. United in Stormwind fwt + sosdp

    传送门 文章目录 题意: 思路: 题意: 有nnn个试卷,每个试卷有mmm个问题,每个问题有两个选项a,ba,ba,b,定义两个试卷不同当且仅当其选中的问题中有一个问题不同.现在问你对于mmm个问题的 ...

  3. 【干货】105页周志华教授《机器学习手推公式》开源PDF

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 上述内容是手推公式的主要内容,本项目的Github主页如下:https://git ...

  4. python基础代码事例-推公式到写代码-python基础

    推公式到写代码-python基础 希望你能像看小说看杂文一样的心情看完这一系列,因为学习不总是枯燥的,希望像聊天一样娓娓道来. 专辑系列的阅读对象是那些懂些高等数学和线性代数,但没有经过编码训练的人. ...

  5. HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)

    在一个D维空间,只有整点,点的每个维度的值是0~n-1 .现每秒生成D条线段,第i条线段与第i维度的轴平行.问D条线段的相交期望. 生成线段[a1,a2]的方法(假设该线段为第i条,即与第i维度的轴平 ...

  6. CodeForces - 466C Number of Ways(推公式/dp)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,现在要求出满足条件的 ( i , j ) 的匹配数量,满足: 题目分析:训练时推的公式,简单说一下吧,维护前缀和 sum,则确定两个断点 ( ...

  7. 【牛客 - 551F】CSL 的神奇序列(推公式,猜结论,母函数)

    题干: 链接:https://ac.nowcoder.com/acm/contest/551/F 来源:牛客网 题目描述 CSL 有一个神奇的无穷实数序列,他的每一项满足如下关系: 对于任意的正整数 ...

  8. Turing Tape (推公式 模拟)

    Turing Tape - CodeForces 132A - Virtual Judge (csgrandeur.cn) 题意: 记录一个数字的前n个二进制数表示的十进制数 int t=s[i];L ...

  9. 2017 icpc 西安赛区 B.Coin(推公式+二项式定理)

    Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face u ...

最新文章

  1. vue中点击导航栏部分,页面切换
  2. el 中requestScope和param
  3. 第16讲 用户程序的结构与执行
  4. C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
  5. mkdir命令使用范例
  6. c 连接mysql错误信息_使用C语言访问MySQL数据 —— 连接和错误处理
  7. 简约好看的域名售卖页html源码
  8. Unity打包APK细节(翻译自官网)
  9. cf1月超级翻盘_CF1月超级翻牌活动地址 2020年CF超级翻盘活动全攻略
  10. 【Hoxton.SR1版本】Spring Cloud Config服务配置中心
  11. Altium Designer使用-----智能pdf输出装配图
  12. mysql类exadata功能_查看Exadata的版本
  13. 字幕/打轴/压制小tip——Aegisub MeGUI 极简操作指南
  14. dragonfly 踩坑指南
  15. 高项_第十三章项目合同管理
  16. 一道有关自然对数e的不等式问题
  17. Unity Realistic FPS插件 Ironsights脚本简化
  18. java实现输入信用卡号码
  19. rfc4309规范原文和机翻——aead ccm
  20. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(下)

热门文章

  1. java在文本区输出方法_Java文件的几种读取、输出方式
  2. mysql 函数 局部变量_MySQL 存储过程 存储函数 局部变量 游标 概念示例
  3. vb6源码 ymodem_任意字符的ASCII码转换工具,基于VB6的源代码VB字符串处理源码下载...
  4. Redis操作Hash相关API
  5. Nginx负载均衡策略介绍
  6. SpringBoot底层注解-@ImportResource导入Spring配置文件
  7. MyBatis 缓存详解-一级缓存的不足
  8. 将session维护在客户端
  9. 缓存-SpringCache-自定义缓存配置
  10. 反射获取成员变量并改值