51Nod1824 染色游戏 【Lucas定理】【FMT】【位运算】
我的FMT是在VFleaKing的论文中学到的。51Nod的评测机好恶心。
题目分析:
题目很明显是要你求一个类似卷积的式子。但是我们可以注意到前面具有组合数,如果拆成阶乘会很大,在模意义下你无法判断奇偶性。另辟蹊径,可以采用Lucas定理分析。
观察组合数的奇偶性,就会发现$\binom{n}{k} % 2 == 0$的充要条件是在模$2$意义下不存在$\binom{0}{1}$。这意味着$\binom{0}{0} \binom{1}{1} \binom{1}{0}$都是可以接受的。换句话说$k$是$n$的子集。注意到原来的是基础的卷积形式,所以我们要做的是对a和b的子集卷积。
全程在模$2$意义下进行,不难想到用二进制压位。
代码:
#include<bits/stdc++.h>
using namespace std; #define RI register int const int maxn = (<<)+; int n,m,len;
int a[maxn],b[maxn];
char buffer[], *buf=buffer; inline void in(int &x) {
while(*buf>'' || *buf<'') ++buf;
for(x=;*buf>=''&&*buf<=''; ++buf) x=x*+*buf-'';
} inline void in1(int &x){
while(*buf>'' || *buf<'') ++buf;
x = *buf-'';++buf;
} struct Bitset{
unsigned long long data[<<];
int PrintBit(int now){
int tm = now>>,im = now&;
return (bool)(data[tm]&(1ll<<im));
}
void reset(int start,int len){
int tm = start>>,im = start&;
if(len >= ){
int ww = len>>;
for(RI i=;i<ww;++i)data[tm+ww+i] ^= data[tm+i];
}else{
long long forw = (((1ll<<len)-)<<im);
forw = (forw&data[tm]);
forw <<= len; data[tm] ^= forw;
}
}
void SetBit(int now){
int tm = now>>,im = now&;
data[tm] |= (1ll<<im);
}
}am[],bm[],cm[]; int cnt[maxn];
int f1,f2; void read(){
in(n),in(m);
for(RI i=;i<=n;++i) in1(a[i]);
for(RI i=;i<=m;++i) in1(b[i]);
for(RI i=;i<=n;++i) a[i] &= ;
for(RI i=;i<=m;++i) b[i] &= ;
n = (n>m?n:m);m = ;len = ;
while(m <= n) m<<=,len++;
a[] = b[] = ;
} void FMT(int place,int st){
if(place == ){
for(RI i=;i<m;i<<=){
int jg = m/(i<<);
for(RI j=;j<m;j+=(jg<<))
am[st].reset(j,jg);
}
}else{
for(RI i=;i<m;i<<=){
int jg = m/(i<<);
for(RI j=;j<m;j+=(jg<<))
bm[st].reset(j,jg);
}
}
} void IFMT(int num){
for(RI i=;i<m;i<<=){
for(RI j=;j<m;j+=(i<<))
cm[num].reset(j,i);
}
} void work(){
for(RI i=;i<m;++i) { cnt[i] = cnt[i>>]+(i&); }
for(RI i=;i<=n;++i) {
if(a[i]) am[cnt[i]].SetBit(i);
if(b[i]) bm[cnt[i]].SetBit(i);
}
for(RI i=;i<=len;++i){ FMT(,i); FMT(,i); }
for(RI i=;i<m;++i){
f1 = ,f2 = ;
for(RI j=;j<=len;++j){
f1 += (am[j].PrintBit(i)<<j);
f2 += (bm[j].PrintBit(i)<<j);
}
int n1 = ,n2 = ;
for(RI j=;j<=len;++j){
n1 = n1+(f1&(<<j));
if(f2&(<<j)) n2 = (n2<<)+;
else n2 <<=;
if(cnt[n1&n2]&) cm[j].SetBit(i);
}
}
for(RI i=;i<=len;++i) IFMT(i);
long long ans = ;
for(RI i=;i<m;++i){
ans += 1ll*cm[cnt[i]].PrintBit(i)*i*i;
}
printf("%lld",ans);
} int main(){
fread(buffer, , (sizeof buffer)-, stdin);
read();
work();
return ;
}
51Nod1824 染色游戏 【Lucas定理】【FMT】【位运算】的更多相关文章
- LeetCode | 289. 生命游戏(原地算法/位运算)
记录dalao的位运算骚操作 根据百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细 ...
- BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...
- 【算法学习笔记】组合数与 Lucas 定理
卢卡斯定理是一个与组合数有关的数论定理,在算法竞赛中用于求组合数对某质数的模. 第一部分是博主的个人理解,第二部分为 Pecco 学长的介绍 第一部分 一般情况下,我们计算大组合数取模问题是用递推公式 ...
- 【2018寒假集训 Day1】【位运算】翻转游戏
翻转游戏(flip) [问题描述] 翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每 个格子都放着一个双面的物件.每个物件的两个面,一面是白色,另一面是黑色, 每个物件要么 ...
- @总结 - 2@ 位运算卷积/子集卷积 —— FWT/FMT
目录 @0 - 参考资料@ @1 - 异或卷积概念及性质@ @2 - 快速沃尔什正变换(异或)@ @3 - 快速沃尔什逆变换(异或)@ @4 - 与卷积.或卷积@ @5 - 参考代码实现@ @6 - ...
- 51Nod 1069 Nim游戏 (位运算)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆 ...
- 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...
- 组合数取模Lucas定理及快速幂取模
组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1) , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...
- Lucas定理及应用
额,前两天刚讲了数据结构,今天我来讲讲组合数学中的一种奇妙优化——Lucas 先看这样一个东西 没学过lucas的肯定会说:还不简单?处理逆元,边乘边膜呗 是,可以,但注意一下数据范围 你算这一次,你 ...
随机推荐
- flink1.7自定义source实现
flink读取source data 数据的来源是flink程序从中读取输入的地方.我们可以使用StreamExecutionEnvironment.addSource(sourceFunction) ...
- nginx负载均衡精简配置实例
[root@localhost ~]# vim nginx.conf user nginx; worker_processes ; error_log /var/log/nginx/error.log ...
- Latex(表格|图片(一丢丢))
目录 普通的例子 Notation 例子 p{width} 列分割符 @{} \multicolumn supertabular | longtabular 浮动体 table 浮动体 图片 \use ...
- Vladik and Complicated Book CodeForces - 811B (思维实现)
Vladik had started reading a complicated book about algorithms containing n pages. To improve unders ...
- WebPack牛刀小试
现在页面的功能和需求越来越复杂,繁复杂乱的JavaScript代码和一大堆的依赖包都需要包含在前端页面中.如果还用手动处理就有点像在现代战场上使用小米加步枪的味道了. 为了减小开发的复杂度,前端社区涌 ...
- JAVA项目中的常用的异常处理情况
NO.1 java.lang.NullPointerException 这个异常比较容易遇到,此异常的解释是“程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现 ...
- Python“Non-ASCII character 'xe5' in file”报错问题
今天在编译一个Python程序的时候,一直出现“Non-ASCII character 'xe5' in file”报错问题 SyntaxError: Non-ASCII character '\xe ...
- Django之事务
Django之事务 事务就是将一组操作捆绑在一起,只有当这一组操作全部都成功以后这个事务才算成功;当这组操作中有任何一个没有操作成功,则这个操作就会回滚,回到操作之前的状态. 其中牵扯到向数据库中写数 ...
- 【kindle笔记】之 《明朝那些事儿》-2018-7-1
[kindle笔记]读书记录-总 最近在读这本书.之前在微信读书里断断续续读过,读到深处还想蹦起来做笔记那种.后来种种原因断了,再没续上. 现在又开始啦.最近还在重八兄造反阶段,还很早呢,有时候晚上玩 ...
- HDU 3947 Assign the task
http://acm.hdu.edu.cn/showproblem.php?pid=3974 Problem Description There is a company that has N emp ...