题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301

好题!看了TJ才会。

因为是不可重集合,所以当然有前 i 个表示A和B都考虑的前 i 个,新加一个讨论放A、放B、不放。

A<B在异或上看就是有一位,它前面的A和B都一样,该位A是0、B是1。该位可以枚举。然后就能dp了。

注意边界细节……和标程对拍真愉快……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,mod=1e9+;
int n,m,mi,mj,lm,dp[][M][],ans,bin[];
int calc(int a)
{
int ret=; while(a) a>>=,ret++; return ret;
}
void ad(int &x,int y)
{
x=(x+y>=mod?x+y-mod:x+y);
}
int main()
{
scanf("%d%d",&n,&m);
mi=max(n,m); lm=calc(m); int tmp=calc(mi);
bin[]=; for(int i=;i<=tmp;i++) bin[i]=(bin[i-]<<);//tmp not lm!!!
bin[tmp+]=(bin[tmp]<<);
mj=bin[tmp+]-;
for(int t=;t<=lm;t++)
{
memset(dp[],,sizeof dp[]);///not dp[0] if mj isn't gu ding
dp[][][]=;
// mj=1;
for(int i=,u,v;i<=mi;i++)
{
u=(i&);v=!u;
// if(i>=bin[mj])mj++;
// for(int j=0;j<=bin[mj];j++)
for(int j=;j<=mj;j++)
{
dp[u][j][]=dp[v][j][];
dp[u][j][]=dp[v][j][];
if(i<=n)//A
{
ad(dp[u][j][],dp[v][j^i][]);
ad(dp[u][j][],dp[v][j^i][]);
}
if(i<=m)//B
{
bool d=(i&bin[t]);
ad(dp[u][j][],dp[v][j^i][^d]);
ad(dp[u][j][],dp[v][j^i][^d]);
}
}
}
int d=(mi&);// mi not n!!!
for(int i=bin[t];i<bin[t+];i++) ad(ans,dp[d][i][]);
}
printf("%d\n",ans);
return ;
}

51nod 1301 集合异或和——异或dp的更多相关文章

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

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

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

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

  3. [51nod] 1301 集合异或和

    考虑不限制xor{Y}>xor{X} 考虑n=m的情况,每个数i∈[1,n]可以被分配到X集合或Y集合,或不分配 设f[S]表示{X} xor {Y} == S的方案数 有f[S]+=2*f[S ...

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

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

  5. bzoj 4017 子序列和的异或以及异或的和

    位运算很好的一个性质是可以单独每一位考虑..... 题解请看:http://blog.csdn.net/skywalkert/article/details/45401245 对于异或的和,先枚举位, ...

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

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

  7. [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)

    Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...

  8. 异或序列 [set优化DP]

    也许更好的阅读体验 \(\mathcal{Description}\) 有一个长度为 \(n\)的自然数序列 \(a\),要求将这个序列分成至少 \(m\) 个连续子段 每个子段的价值为该子段的所有数 ...

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

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

随机推荐

  1. zabbix server 端安装

    1.系统环境 [root@crazy-acong ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@crazy-acong ~] ...

  2. 在VS2017环境中编译libxml2库

    libxml2库编译 1.下载libxml2,官网是:http://www.xmlsoft.org/downloads.html, 我下载的版本是:libxml2-sources-2.9.7.tar. ...

  3. centos7 使用 maven

    http://www.cnblogs.com/jackluo/archive/2013/02/06/2901816.html

  4. Eclipse +Tomcat配置-【菜鸟学JAVA】

    说起来也惭愧,以前用(Unieap)工具搞了一年多的JAVA+Oracle,现在居然在Eclipse中配置tomcat都搞了半天时间,原来一直是做.NET的. 今天开始不再用集成的环境,话不多说,开始 ...

  5. QT修改应用程序图标

    要准备一个ico的图标,必须是ico格式,切记!! 可以用png或者其他的在线转换:http://www.easyicon.net/covert/ 用记事本 新建文件icon.rc,内容为: IDI_ ...

  6. C#读取excel 找不到可安装的ISAM

    实在没有办法了 就仔细的查看了 一下数据链接字符串: string strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" ...

  7. IImage--factory

    <?php /* 实例4 */ /* 使用工厂类解析图像工作 */ interface IImage { function getWidth(); function getHeight(); f ...

  8. php正则表达式和数组

    一.正则表达式 1. “/”代表定界符,"^"代表起始符号,"$"代表结束符号 $str1="abc123def45ghjk6789lou" ...

  9. 2018年长沙理工大学第十三届程序设计竞赛 G 逃离迷宫 【BFS】

    链接:https://www.nowcoder.com/acm/contest/96/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  10. ubuntu中文语言环境下把系统中文文件夹更改回英文文件夹

    更改系统语言为“汉语(中国)”后,在主文件夹下的系统默认文件夹名称也被改成了中文, 这样的话,使用命令行终端进行入文件夹很不方便,所以可以把文件夹名称从中文改回英文. 打开终端,在终端中输入命令:ex ...