题目

有 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]\)

于是

原式得

\[f(t)=\sum_{x+y=t}r_xb_y[x\ and\ y=0]
\]

\[=\sum_{x+y=t}r_xb_y[x\ or\ y=t]
\]

\[=\sum_{x\ or\ y=t}r_xb_y[x+y=t]
\]

设\(bit(i)\)表示二进制下i的1的个数

\[=\sum_{x\ or\ y=t}r_xb_y[bit(x)+bit(y)=bit(t)]
\]

然后考虑如何用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。

  1. #include <cmath>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <map>
  9. #include <bitset>
  10. const int maxlongint=2147483647;
  11. const int mo=1e9+7;
  12. const int N=2200005;
  13. const int M=1<<8;
  14. using namespace std;
  15. #define sqr(x) (1ll*(x)*(x))
  16. int n,m,r[N],b[N],fn,bit[N];
  17. long long ans;
  18. int rr[23][N>>3],bb[23][N>>3],v[4],mi[10];
  19. int val(int i,int j)
  20. {
  21. return (i<<3)+7-j;
  22. }
  23. void read(int *a,int n)
  24. {
  25. for(int i=1;i<=n;i++)
  26. {
  27. char c=getchar();
  28. for(;c<'0' || c>'9';c=getchar());
  29. a[i]=c-'0';
  30. }
  31. }
  32. void FWT(int *f)
  33. {
  34. for(int len=1;len<=3;len++)
  35. for(int i=0;i<fn>>3;i++)
  36. f[i]^=(f[i]&v[len])>>(1<<(len-1));
  37. for(int len=2;len<=fn>>3;len<<=1)
  38. {
  39. int half=len>>1;
  40. for(int i=0;i<half;i++)
  41. for(int j=i;j<fn>>3;j+=len) f[j+half]^=f[j];
  42. }
  43. }
  44. int main()
  45. {
  46. freopen("1824.in","r",stdin);
  47. freopen("1824.out","w",stdout);
  48. scanf("%d%d",&n,&m);
  49. fn=1<<21,v[1]=170,v[2]=204,v[3]=240;
  50. mi[0]=1;
  51. for(int i=1;i<=8;i++) mi[i]=mi[i-1]<<1;
  52. for(int i=0;i<=fn;i++)
  53. for(int x=i;x;x&=x-1,bit[i]++);
  54. r[0]=b[0]=1;
  55. read(r,n),read(b,m);
  56. for(int i=0;i<fn>>3;i++)
  57. for(int j=7;j>=0;j--)
  58. 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];
  59. for(int i=0;i<=20;i++) FWT(rr[i]),FWT(bb[i]);
  60. for(int i=0;i<fn>>3;i++)
  61. {
  62. for(int k=20;k>=0;k--)
  63. {
  64. int tmp=0;
  65. for(int j=0;j<=k;j++)
  66. tmp^=bb[k-j][i]&rr[j][i];
  67. rr[k][i]=tmp;
  68. }
  69. }
  70. for(int i=0;i<=20;i++) FWT(rr[i]);
  71. for(int i=0;i<fn>>3;i++)
  72. for(int j=7;j>=0;j--)
  73. if(val(i,j)<=n+m)
  74. if(rr[bit[val(i,j)]][i]&mi[j]) ans+=sqr(val(i,j));
  75. printf("%lld\n",ans);
  76. }

【51nod 1824】染色游戏的更多相关文章

  1. 51nod 1459 迷宫游戏(dij)

    题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...

  2. 【BZOJ1434】[ZJOI2009]染色游戏(博弈论)

    [BZOJ1434][ZJOI2009]染色游戏(博弈论) 题面 BZOJ 洛谷 题解 翻硬币的游戏我似乎原来在博客里面提到过,对于这类问题,当前局面的\(SG\)函数就是所有反面朝上的硬币单一存在时 ...

  3. 题解 [SDOI2009]E&D/染色游戏/Moving Pebbles

    E&D 染色游戏 Moving Pebbles E&D 题目大意 给出 \(2n\) 堆石子,\(2i-1\) 和 \(2i\) 为一组.每次可以选择一组删掉其中一堆,然后从同一组另外 ...

  4. 51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)

    首先,51nod的那道题就是最简单的尼姆博弈问题. 尼姆博弈主要就是判断奇异局势,现在我们就假设有三个石子堆,最简单的(0,n,n)就是一个奇异局势,因为无论先手怎么拿,后手总是可以在另一堆里拿走相同 ...

  5. 51nod 1459 迷宫游戏 dijkstra模板

    链接:迷宫游戏 问题 - 51Nod  http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 1459 迷宫游戏  基准 ...

  6. 51nod 1534 棋子游戏

    1534 棋子游戏 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 http://www.51nod.com/onlineJudg ...

  7. 51Nod 1070 Bash游戏 V4(斐波那契博弈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...

  8. 51nod 1070 Bash游戏 V4 (斐波那契博弈)

    题目:传送门. 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的 ...

  9. [ZJOI2009]染色游戏

    Description 一共n × m 个硬币,摆成n × m 的长方形.dongdong 和xixi 玩一个游戏, 每次可以选择一个连通块,并把其中的硬币全部翻转,但是需要满足存在一个 硬币属于这个 ...

随机推荐

  1. C学习笔记-基础数据结构与算法

    数据结构 数据(data)是对客观事物符号表示,在计算机中是指所有能输入的计算机并被计算机程序处理的数据总称. 数据元素(data element)是数据的基本单位,在计算机中通常做为一个整体进行处理 ...

  2. flask standrad class 使用

    from flask import Flask,views,url_for app = Flask(__name__) class IndexView(views.View): def dispatc ...

  3. SpringCloud(0) 外行人都能看懂的SpringCloud,错过了血亏!

    一.前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的 ...

  4. 生成一个水平+垂直居中的div

    这是前端布局经常用到的布局方式,水平垂直居中:面试也经常会问到. 一. 绝对定位实现居中 注意:使用绝对定位布局的时候,外层元素必须也设置有position属性,具体设置为什么值看具体情况.只要不是s ...

  5. PTA(Basic Level)1006.Sign In and Sign Out

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  6. [转帖]国产CPU性能最全盘点 宜良性竞争优胜劣汰

    国产CPU性能最全盘点 宜良性竞争优胜劣汰 电子工程专辑的网站内容 其实里面说的不尽全面 比如龙芯和申威就放到一块了 一个是 MIPS 一个是Alpha 明显不一样的东西 x86的应该都不行 而且. ...

  7. NOIP2017 D2T3 题解

    题面 这种数据范围不是乱搞dfs就是乱搞状压DP 首先应该通过任一方式求出a和b的值: 任意一条抛物线只用两头猪就可以确定,所以我们N^2枚举,并把在这两头猪的抛物线上的猪都存进状态state[i][ ...

  8. 2019中山纪念中学夏令营-Day1[JZOJ]

    T1 题目描述: 1999. Wexley接苹果(apple) (File IO): input:apple.in output:apple.out 时间限制: 1000 ms  空间限制: 1280 ...

  9. Bash Plays with Functions CodeForces - 757E (积性函数dp)

    大意: 定义函数$f_r(n)$, $f_0(n)$为pq=n且gcd(p,q)=1的有序对(p,q)个数. $r \ge 1$时, $f_r(n)=\sum\limits_{uv=n}\frac{f ...

  10. Spring经典高频面试题,原来是长这个样子

    Spring经典高频面试题,原来是长这个样子 2019年08月23日 15:01:32 博文视点 阅读数 719   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文 ...