我的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】【位运算】的更多相关文章

  1. LeetCode | 289. 生命游戏(原地算法/位运算)

    记录dalao的位运算骚操作 根据百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细 ...

  2. BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...

  3. 【算法学习笔记】组合数与 Lucas 定理

    卢卡斯定理是一个与组合数有关的数论定理,在算法竞赛中用于求组合数对某质数的模. 第一部分是博主的个人理解,第二部分为 Pecco 学长的介绍 第一部分 一般情况下,我们计算大组合数取模问题是用递推公式 ...

  4. 【2018寒假集训 Day1】【位运算】翻转游戏

    翻转游戏(flip) [问题描述] 翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每 个格子都放着一个双面的物件.每个物件的两个面,一面是白色,另一面是黑色, 每个物件要么 ...

  5. @总结 - 2@ 位运算卷积/子集卷积 —— FWT/FMT

    目录 @0 - 参考资料@ @1 - 异或卷积概念及性质@ @2 - 快速沃尔什正变换(异或)@ @3 - 快速沃尔什逆变换(异或)@ @4 - 与卷积.或卷积@ @5 - 参考代码实现@ @6 - ...

  6. 51Nod 1069 Nim游戏 (位运算)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆 ...

  7. 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)

    点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...

  8. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...

  9. Lucas定理及应用

    额,前两天刚讲了数据结构,今天我来讲讲组合数学中的一种奇妙优化——Lucas 先看这样一个东西 没学过lucas的肯定会说:还不简单?处理逆元,边乘边膜呗 是,可以,但注意一下数据范围 你算这一次,你 ...

随机推荐

  1. H5海报制作实践

    引言 年后一直处于秣马厉兵的状态,上周接到了一个紧急需求,为38妇女节做一个活动页,主要功能是生成海报,第一次做这种需求,我也是个半桶水前端,这里将碰到的问题.踩的坑,如何解决的分享给大家,讲的不到位 ...

  2. 苹果 icloud 把我 ipad min 所有照片丢失

    苹果 icloud 把我 ipad min 所有照片丢失,大概发生在 '云上贵州' 之后! 发帖纪念--- 求个说法---

  3. Can’t connect to local MySQL server through socket 原因解析

    在连接mysql的时,经常会出现以下错误提示: ERROR (HY000): Can't connect to local MySQL server through socket '/var/lib/ ...

  4. [loadrunner]通过检查点判定事务是否成功

    //检查点设置语句 //tmp在此时为临时参数  web_reg_find("SaveCount=tmp",   "Text=xxx",   LAST);   ...

  5. MySQL的log_bin和sql_log_bin 的区别

    利用二进制还原数据库的时候,突然有点纠结,log_bin和sql_log_bin有什么区别呢?行吧,搜搜,结合自己的经验,简单说一下.log_bin:二进制日志. 在 mysql 启动时,通过命令行或 ...

  6. Codeblocks 遇到的问题 Cannot open output file, permission denied

    Codeblocks下运行C++的程序时,偶尔会出现  Cannot open output file, permission denied 的问题,导致不能够编译. 在 Stack Overflow ...

  7. 打开指定测试App的指定Activity

    那究竟应该如何让appium去自动找到指定的APP和指定的Activity呢?想要打开指定的App,需要知道App的包名,同样想要打开指定Activity也需要知道其名,如何获取? 1.问公司的开发人 ...

  8. Debian搭建WordPress

    环境配置 可以使用apt-get快速安装mysql,php5:我是用源码手动安装apache服务器的.安装完mysql后,最好将字符编码设置为utf8的. 接下来就是mysql,apache,php5 ...

  9. stark组件数据库管理软件的总结

      1.stark - 总结 用到的知识点: 1.单例模式 2.继承 3.反射 4.面向对象 5.modelform 1.注册表 单例模式 site = StarkSite() 2.生成url url ...

  10. Django组件之认证系统

      Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...