51nod 1301 集合异或和——异或dp
题目: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的更多相关文章
- 51Nod 1301 集合异或和 —— 异或DP
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301 参考博客:https://blog.csdn.net/qq_ ...
- 51nod 1301 集合异或和(DP)
因为当\(A<B\)时,会存在在二进制下的一位,满足这一位B的这一位是\(1\),\(A\)的这一位是\(0\). 我们枚举最大的这一位.设为\(x\)吧. 设计状态.\(dp[i][j][1/ ...
- [51nod] 1301 集合异或和
考虑不限制xor{Y}>xor{X} 考虑n=m的情况,每个数i∈[1,n]可以被分配到X集合或Y集合,或不分配 设f[S]表示{X} xor {Y} == S的方案数 有f[S]+=2*f[S ...
- [51Nod 1301] 集合异或和 (dp)
传送门 Solution 一道比较好的dp题 想了半天组合数QAQ 首先要知道的是 A<B一定是B有一位是1且A的这位是0且前面都相等 那么肯定是要枚举这一位在哪里然后求出方案数 方案数考虑类似 ...
- bzoj 4017 子序列和的异或以及异或的和
位运算很好的一个性质是可以单独每一位考虑..... 题解请看:http://blog.csdn.net/skywalkert/article/details/45401245 对于异或的和,先枚举位, ...
- 51Nod 1352 集合计数(扩展欧几里德)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1352 题目大意: 给出N个固定集合{1,N},{2,N-1} ...
- [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)
Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...
- 异或序列 [set优化DP]
也许更好的阅读体验 \(\mathcal{Description}\) 有一个长度为 \(n\)的自然数序列 \(a\),要求将这个序列分成至少 \(m\) 个连续子段 每个子段的价值为该子段的所有数 ...
- 51nod 1622 集合对[算法马拉松19 C]
题目链接:https://www.51nod.com/contest/problem.html#!problemId=1622 第一次参加算法马拉松,我就是去看大神们疯狂秒题,然后感受绝望的orz.. ...
随机推荐
- Labview新建项目步骤
打开Labview软件,点击工具栏中文件选项卡,如图所示. 2 点击新建一个空白项目. 3 此时为未命名项目,按下Ctrl+S保存项目到自己指定的目录并完成命名. 4 如图示在我的电脑上点击右键,新建 ...
- 九度OJ 1198:a+b (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6745 解决:2320 题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位 ...
- 在jsp中嵌入javascript代码执行对html的影响方式
1 javascript的作用范围 javascript操作的是html dom树. 它可以用来直接写入html标签:修改html的内容:响应事件:修改html中的图像:修改html的样式等等. 2 ...
- php自定义函数: 计算两个时间日期相隔的天数,时,分,秒
function timediff( $begin_time, $end_time ) { if ( $begin_time < $end_time ) { $starttime = $begi ...
- JS表单提交
测试一: function submit(){var form1=document.getElementById("form1")form1.action="/manag ...
- python三大器
装饰器 装饰器的作用: 装饰器的本质:一个闭包函数 (高阶函数+嵌套函数) 装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展 闭包原理 装饰器执行流程 带多个参数函数 import ...
- 如何判断移动终端访问还是PC访问?
我们经常需要知道访问网站的设备是移动终端还是PAD还是PC,下面给出判断的java代码供参考.实现的原理就是获取HTTP消息头里User-Agent和x-wap-profile,User-下面是Use ...
- PHP保存数组到文件中的方法
ThinkPHP自3.1以后的版本,F函数保存数组时先序列化后再保存到文件中,因为我需要使用C方法来读取自定义配置文件,故需要把PHP数组保存到文件中以便C方法读取,PHP保存数组到文件的方法如下: ...
- iOS 基本数据类型 和 指针 特点
基本数据类型 : 整型int, 字符型char , 浮点型 (float 和 double), 枚举型; -- 构造类型 : 数组类型, 结构体类型, 共用体类型; -- 指针类型 : 最终要的数据类 ...
- J2EE SSH框架整合教程
本文仅作为学习和研究的参考,与实际项目使用技术有所不同,由于作者水平有限,错误疏漏在所难免,请各位看官批评指教. 项目的源代码放在:https://github.com/Frank-Pei/SSHIn ...