【51nod 1824】染色游戏
题目
有 n 个红球, m 个蓝球,从中取出 x 个红球和 y 个蓝球排成一排的得分是 rx⋅by ,其中 r0=b0=1 。
定义 f(t) 表示恰好取出 t 个球排成一排的所有可能局面的得分之和。
两个局面相同,当且仅当这两排球的个数相等,且在对应列位置上的颜色都是相同的。
小Q想知道,有多少 t (1≤t≤n+m) 使得 f(t) 是奇数,你能告诉他满足条件的 t2 之和吗?
对于样例, f(1)=2,f(2)=5,f(3)=13,f(4)=28,f(5)=50,f(6)=60 ,答案是 $22+32=13 $。
分析
cty爆音通道 to 分治做法什么的看到我一脸懵逼
于是只能打个FWT
题目中的\(f(t)=\sum_{x+y=t}r_xb_yC_{t}^{x}\),这个不用多解释。
然后考虑如何判断\(f(t)\)是否为奇数,
因为只用判断奇偶,只用保留%2的结果。
据说根据lucas定理得出,\(C_{n+m}^n\)为奇数,尤其尤其仅当\([x\ and\ y=0]\)
于是
原式得
\]
\]
\]
设\(bit(i)\)表示二进制下i的1的个数
\]
然后考虑如何用FWT处理这个,
我们让\(rr_{bit(i),i}=r_i,bb_{bit(i),i}=b_i,其余为0\)
然后,对于\(rr_{bit(0-20)},bb_{bit(0-20)}\), 都做一次FWT,
接着,对于\(f_{bit(t),i}=\sum_{bit(x)+bit(y)=bit(t)}rr_{bit(x)}bb_{bit(y)}\)
最后UFWT。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <bitset>
const int maxlongint=2147483647;
const int mo=1e9+7;
const int N=2200005;
const int M=1<<8;
using namespace std;
#define sqr(x) (1ll*(x)*(x))
int n,m,r[N],b[N],fn,bit[N];
long long ans;
int rr[23][N>>3],bb[23][N>>3],v[4],mi[10];
int val(int i,int j)
{
return (i<<3)+7-j;
}
void read(int *a,int n)
{
for(int i=1;i<=n;i++)
{
char c=getchar();
for(;c<'0' || c>'9';c=getchar());
a[i]=c-'0';
}
}
void FWT(int *f)
{
for(int len=1;len<=3;len++)
for(int i=0;i<fn>>3;i++)
f[i]^=(f[i]&v[len])>>(1<<(len-1));
for(int len=2;len<=fn>>3;len<<=1)
{
int half=len>>1;
for(int i=0;i<half;i++)
for(int j=i;j<fn>>3;j+=len) f[j+half]^=f[j];
}
}
int main()
{
freopen("1824.in","r",stdin);
freopen("1824.out","w",stdout);
scanf("%d%d",&n,&m);
fn=1<<21,v[1]=170,v[2]=204,v[3]=240;
mi[0]=1;
for(int i=1;i<=8;i++) mi[i]=mi[i-1]<<1;
for(int i=0;i<=fn;i++)
for(int x=i;x;x&=x-1,bit[i]++);
r[0]=b[0]=1;
read(r,n),read(b,m);
for(int i=0;i<fn>>3;i++)
for(int j=7;j>=0;j--)
rr[bit[val(i,j)]][i]^=(r[val(i,j)]&1)*mi[j],bb[bit[val(i,j)]][i]^=(b[val(i,j)]&1)*mi[j];
for(int i=0;i<=20;i++) FWT(rr[i]),FWT(bb[i]);
for(int i=0;i<fn>>3;i++)
{
for(int k=20;k>=0;k--)
{
int tmp=0;
for(int j=0;j<=k;j++)
tmp^=bb[k-j][i]&rr[j][i];
rr[k][i]=tmp;
}
}
for(int i=0;i<=20;i++) FWT(rr[i]);
for(int i=0;i<fn>>3;i++)
for(int j=7;j>=0;j--)
if(val(i,j)<=n+m)
if(rr[bit[val(i,j)]][i]&mi[j]) ans+=sqr(val(i,j));
printf("%lld\n",ans);
}
【51nod 1824】染色游戏的更多相关文章
- 51nod 1459 迷宫游戏(dij)
题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...
- 【BZOJ1434】[ZJOI2009]染色游戏(博弈论)
[BZOJ1434][ZJOI2009]染色游戏(博弈论) 题面 BZOJ 洛谷 题解 翻硬币的游戏我似乎原来在博客里面提到过,对于这类问题,当前局面的\(SG\)函数就是所有反面朝上的硬币单一存在时 ...
- 题解 [SDOI2009]E&D/染色游戏/Moving Pebbles
E&D 染色游戏 Moving Pebbles E&D 题目大意 给出 \(2n\) 堆石子,\(2i-1\) 和 \(2i\) 为一组.每次可以选择一组删掉其中一堆,然后从同一组另外 ...
- 51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)
首先,51nod的那道题就是最简单的尼姆博弈问题. 尼姆博弈主要就是判断奇异局势,现在我们就假设有三个石子堆,最简单的(0,n,n)就是一个奇异局势,因为无论先手怎么拿,后手总是可以在另一堆里拿走相同 ...
- 51nod 1459 迷宫游戏 dijkstra模板
链接:迷宫游戏 问题 - 51Nod http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 1459 迷宫游戏 基准 ...
- 51nod 1534 棋子游戏
1534 棋子游戏 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 http://www.51nod.com/onlineJudg ...
- 51Nod 1070 Bash游戏 V4(斐波那契博弈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...
- 51nod 1070 Bash游戏 V4 (斐波那契博弈)
题目:传送门. 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的 ...
- [ZJOI2009]染色游戏
Description 一共n × m 个硬币,摆成n × m 的长方形.dongdong 和xixi 玩一个游戏, 每次可以选择一个连通块,并把其中的硬币全部翻转,但是需要满足存在一个 硬币属于这个 ...
随机推荐
- Linux C/C++基础 文件(中)
1.ubuntu cat命令的实现 cat——查看或者合并文件内容 #include<stdio.h> int main(int argc,char* argv[]) { //1.打开文件 ...
- mac 上iterm终端连接Linux服务后 中文为乱码问题
https://www.jianshu.com/p/8b00f71b2177 编辑 ssh 配置vim /etc/ssh/ssh_config修改如下:Host *#SendEnv LANG LC_* ...
- 链表--笔记--数据结构(C++版)王红梅--自我思路整理与梳理
看到这篇文的很多人大概都知道链表是个什么玩意了.简单说就是一个又一个的指针,指针之间用指针连接起来. 本文的阅读 适合有c++基础的人群 以下: 这叫做一个结点. 这就是一个链表.我们主要使用的是 ...
- CSP 最大的矩形(201312-3)
问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...
- IOS订阅优惠-PHP生成ECDSA算法签名
<?php use Ramsey\Uuid\Uuid; class ItunesSignatureGenerator { private $appBundleID = 'www.u17.com' ...
- java基础: synchronized与Lock的区别
主要区别 1. 锁机制不一样:synchronized是java内置关键字,是在JVM层面实现的,系统会监控锁的释放与否,lock是JDK代码实现的,需要手动释放,在finally块中释放.可以采用非 ...
- PHP7 错误及异常机制
关键词 error 不能在编译期发现的运行期错误,比如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断: exception 程序执行过程中出现意料之外的情况, ...
- oa_mvc_easyui_登录完成(2)
1.使用MVC特有的ajax方式:异步表单提交方式 js文件引用:<script src="~/Scripts/jquery.unobtrusive-ajax.min.js" ...
- java web实现同一账号在不同浏览器不能同时登录
网上看了很多方法,个人也看了,自己也总结了几个比较常用的: 前提都是用session监听器,对session的创建与销毁进行监听 一.在用户登录时保存该用户的状态有这几种保存方式: 1.保存到内存中( ...
- css3实现div自动左右动
<!DOCTYPE html> <meta charset="UTF-8"/> <html> <head> <style> ...