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.. ...
随机推荐
- Xshell连接不上行Linux系统
之前出现了.我的Linux系统上的主机可以ping通windows的一台电脑, windows也可以ping的通Linux.但是Xshell不能连接. 第一,我感觉是不是我Linux系统的端口被防火墙 ...
- js函数的caller属性
funcName.caller : 返回一个对函数的引用, 该函数调用了当前函数 function test() { if (test.caller) { var a = test.caller.to ...
- 【python】-- RabbitMQ RPC模型
RabbitMQ RPC模型 RPC(remote procedure call)模型说通俗一点就是客户端发一个请求给远程服务端,让它去执行,然后服务端端再把执行的结果再返回给客户端. 1.服务端 i ...
- android在activity中去掉标题栏
package com.goodness.goodness; import android.support.v7.app.AppCompatActivity; import android.os.Bu ...
- python基础22------python基础之基于tcp和udp的套接字
一.TCP套接字 1.low版tcp套接字 服务器端 客户端 2.改进版tcp套接字 服务端 客户端 二.UDP的套接字 服务器 客户端 注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就 ...
- Effective java -- 7 通用程序设计
第四十五条:将局部变量的作用域最小化 第四十六条:加强版for循环优于传统for循环 第四十七条:了解和使用类库书中提到了一个生成随机数的例子.正好需要. public static void mai ...
- OpenStack Neutron 之 Load Balance
OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请 ...
- java-从这里开始认识
<java是什么:>Programming language 程序语言Development environment 开发环境Application environment 应用环境Dep ...
- vim配置文件 .vimrc 重要参数
vim配置文件的路径为 ~/.vimrc 重要参数如下: set mouse=a //激活鼠标可用 syntax enable //开启语法 set cursorline //开启当前行光标线 ...
- java深入探究03
1.Tomcat 我们的浏览器其实就是一个Socket客户端能接受Socket服务端发来的消息 一:市面上的web服务器 javase的规范,包含IO流,线程,集合,socket编程.... WebL ...