考虑不限制xor{Y}>xor{X}

  • 考虑n=m的情况,每个数i∈[1,n]可以被分配到X集合或Y集合,或不分配
  • 设f[S]表示{X} xor {Y} == S的方案数
  • 有f[S]+=2*f[S^i]
  • 考虑n!=m,那就是多余的部分得强制分配,分开两个转移即可

考虑限制xor{Y}>xor{X}

  • 对于数B>A,在二进制表示下,就是B和A的前面相等,直到某一位B为1,A为0,之后无所谓
  • 枚举这一位k,限制B(xor{Y})第k位为1,且B xor A第k位为0(统计答案限制范围)
  • 状态加一维f[S][0/1]表示A xor B==S且B的第k位是0/1
  • 转移分开讨论两个情况
  • 1.放进X集合,直接继承状态
  • 2.放进Y集合,根据i第k位转移
    1. #include<iostream>
    2. #include<cstring>
    3. #include<cstdio>
    4.  
    5. using namespace std;
    6.  
    7. inline int rd(){
    8. int ret=,f=;char c;
    9. while(c=getchar(),!isdigit(c))f=c=='-'?-:;
    10. while(isdigit(c))ret=ret*+c-'',c=getchar();
    11. return ret*f;
    12. }
    13.  
    14. const int MOD = ;
    15. const int MAXN = ;
    16. int n,m;
    17.  
    18. long long f[MAXN][],g[MAXN][];
    19. long long ans;
    20.  
    21. int main(){
    22. n=rd();m=rd();
    23. int mx=max(n,m),tmp=mx;
    24. int len=;
    25. while(tmp){len++;tmp>>=;}
    26. for(int k=;k<=len;k++){
    27. memset(f,,sizeof(f));
    28. f[][]=;
    29. for(int i=;i<=mx;i++){
    30. memcpy(g,f,sizeof(f));
    31. for(int s=mx<<;s>=;s--){
    32. if(i<=n){
    33. f[s][]+=g[s^i][];
    34. f[s][]+=g[s^i][];
    35. }
    36. if(i<=m){
    37. f[s][]+=g[s^i][(i>>(k-))&];
    38. f[s][]+=g[s^i][((i>>(k-))+)&];
    39. }
    40. f[s][]%=MOD;f[s][]%=MOD;
    41. }
    42. }
    43. for(int i=(<<(k-));i<(<<k);i++){
    44. ans+=f[i][];
    45. }
    46. ans%=MOD;
    47. }
    48. cout<<ans;
    49. return ;
    50. }

[51nod] 1301 集合异或和的更多相关文章

  1. 51nod 1301 集合异或和——异或dp

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301 好题!看了TJ才会. 因为是不可重集合,所以当然有前 i 个 ...

  2. 51Nod 1301 集合异或和 —— 异或DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301 参考博客:https://blog.csdn.net/qq_ ...

  3. 51nod 1301 集合异或和(DP)

    因为当\(A<B\)时,会存在在二进制下的一位,满足这一位B的这一位是\(1\),\(A\)的这一位是\(0\). 我们枚举最大的这一位.设为\(x\)吧. 设计状态.\(dp[i][j][1/ ...

  4. [51Nod 1301] 集合异或和 (dp)

    传送门 Solution 一道比较好的dp题 想了半天组合数QAQ 首先要知道的是 A<B一定是B有一位是1且A的这位是0且前面都相等 那么肯定是要枚举这一位在哪里然后求出方案数 方案数考虑类似 ...

  5. 51Nod 1352 集合计数(扩展欧几里德)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1352 题目大意: 给出N个固定集合{1,N},{2,N-1} ...

  6. 51nod 1622 集合对[算法马拉松19 C]

    题目链接:https://www.51nod.com/contest/problem.html#!problemId=1622 第一次参加算法马拉松,我就是去看大神们疯狂秒题,然后感受绝望的orz.. ...

  7. 51Nod 1352 集合计数 扩展欧几里得

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足 ...

  8. 51nod 1551 集合交易 最大权闭合子图

    题意: 市场中有n个集合在卖.我们想买到满足以下要求的一些集合,所买到集合的个数要等于所有买到的集合合并后的元素的个数. 每个集合有相应的价格,要使买到的集合花费最小. 这里我们的集合有一个特点:对于 ...

  9. MATLAB中的集合运算

    matlab里关于集合运算和二进制数的运算的函数 intersect:集合交集ismember :是否集合中元素setdiff :集合差集setxor :集合异或(不在交集中的元素)union :两个 ...

随机推荐

  1. [Swift]LeetCode1081. 不同字符的最小子序列 | Smallest Subsequence of Distinct Characters

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. SublimeText3 snippet 编写总结

    SublimeText3 snippet 编写总结 SublimeText的snippet定义功能也十分强大, 类似VAssist. 在菜单tool->New Snippet中定义.  打开后显 ...

  3. [Leetcode] 002. Add Two Numbers

    https://leetcode.com/problems/add-two-numbers/ public class Solution { public ListNode addTwoNumbers ...

  4. kali linux安装搜狗输入法

    1. 更新软件源 vi /etc/apt/sources.list 2. 安装fcitx apt-get install fcitx 3. 下载deb包到指定目录, dpkg -i sogou**** ...

  5. 线段树 & 题目

    首先说下我写的线段树吧. 我是按照线段树[完全版]那个人的写法来写的,因为网上大多数题解都是按照他的写法来写. 确实比较飘逸,所以就借用了. 节点大小是maxn是4倍,准确来说是大于maxn的2^x次 ...

  6. MapReduce基本流程与设计思想初步

    1.MapReduce是什么? MapReduce是一种编程模型,用于大规模数据集的并行运算.它借用了函数式的编程概念,是Google发明的一种数据处理模型. 主要思想为:Map(映射)和Reduce ...

  7. React Router 4.0中文快速入门

    import React from 'react' import { BrowserRouter as Router, Route, Link } from 'react-router-dom' co ...

  8. IDEA对比文件

    和另一个文件对比:右击文件,选择另一个文件 和剪切板的内容对比:右击代码区域

  9. linux 安装jdk (二进制文件安装)

    1.下载jdk 此处以1.7 为例 :jdk-7u79-linux-x64.tar.gz 2.通过ssh将安装介质传到服务器 我一般放在 /opt 目录下 3.用tar 命令解压缩   tar -zx ...

  10. zuul忽略表达式

    如果有error过滤器,会进入error