WinterAndSnowmen

https://vjudge.net/problem/TopCoder-12891
暴力想法是:dp[i][s1][s2]前i个,第一个集合xor是s1,第二个集合xor是s2方案数O(n^3)
有xor
不妨按位考虑
枚举两个集合xor的LCP长度L
考虑从高到低前L位相同,第L+1位xor(X)=0,xor(Y)=1的方案数
剩下的低位就随便选择了
f[i][s][0/1][0/1]表示前i个数,前L位高位的xor和是s,第L+1位分别是0/1,0/1的方案数
每一个合法的方案都会被枚举到恰好一次。
复杂度:O(logn*n*(n/logn)=n^2)
代码:
(Topcoder还要class。。。)
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
const int mod=1e9+;
const int N=;
int n,m;
int ans=;
int f[N][][][];
int mo(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
class WinterAndSnowmen {
public:
int getNumber(int n, int m) { int U=max(n,m);
for(reg p=;p>=;--p){
memset(f,,sizeof f);
f[][][][]=;
for(reg i=;i<U;++i){//calc i+1
for(reg s=;s<(<<(-p));++s){
for(reg l1=;l1<=;++l1){
for(reg l2=;l2<=;++l2){
int num=i+;
f[i+][s][l1][l2]=mo(f[i+][s][l1][l2],f[i][s][l1][l2]);
if(i+<=n)f[i+][s^(num>>(p+))][l1^((num>>p)&)][l2]=mo(f[i+][s^(num>>(p+))][l1^((num>>p)&)][l2],f[i][s][l1][l2]);
if(i+<=m)f[i+][s^(num>>(p+))][l1][l2^((num>>p)&)]=mo(f[i+][s^(num>>(p+))][l1][l2^((num>>p)&)],f[i][s][l1][l2]);
}
}
}
}
ans=mo(ans,f[U][][][]);
}
return ans;
}
};
WinterAndSnowmen的更多相关文章
- [SRM603] WinterAndSnowmen
Description Sol 设 \(A=\text{XOR}(X)\),\(B=\text{XOR}(Y)\). 因为 \(A<B\),所以写下他们的二进制表示,一定是最高的几位先是相等,紧 ...
- 【做题】TCSRM601 Div1 500 WinterAndSnowmen——按位考虑&dp
原文链接https://www.cnblogs.com/cly-none/p/9695526.html 题意:求有多少对集合\(S,T\)满足:\(S \subseteq \{1,2...n \}, ...
- SRM 601(1-250pt,500pt)
DIV1 250pt 题意:有很多袋子,里面装有苹果和橘子(也可能没有),给出每个袋子里有多少个苹果,多少个橘子.如果每个袋子里含有水果的总数都不小于x个,则可以从每个袋子里都拿出x个水果(拿出苹果和 ...
- SRM 601 DIV1
A 枚举x , 然后对于确定的x , 最后总的apple数对应了唯一的orange数,因此问题转化为求apple的取值范围; apple的取值范围: max为每个bag取最多的apple , min为 ...
- 来自多校的一个题——数位DP+卡位
n<=1e9就要考虑倍增.矩阵乘法这种了 假设L=0 考虑枚举二进制下,所有X与R的LCP长度,前len高位 对于第len+1位,假设R的这一位是1 如果一个x的这一位是0了,那么后面可以随便填 ...
- Topcoder SRM 601 div1题解
日常TC计划- Easy(250pts): 题目大意:有n个篮子,每个篮子有若干个苹果和橘子,先任取一个正整数x,然后从每个篮子中选出x个水果,把nx个水果放在一起,输出一共有多少种不同的组成方案.其 ...
随机推荐
- C# Note26: [MethodImpl(MethodImplOptions.Synchronized)]与lock机制
在进行.NET开发时,经常会遇见如何保持线程同步的情况.在众多的线程同步的可选方式中,加锁无疑是最为常用的.如果仅仅是基于方法级别的线程同步,使用System.Runtime.CompilerServ ...
- element-ui 源码解析 一
Button组件 button.vue <template> <button class="el-button" @click="handleClick ...
- Django--ORM和单表查询
一 . ORM ORM是“对象-关系-映射”的简称.(Object Relational Mapping,简称ORM) 二. 单表操作 要想将模型转为mysql数据库中的表,需要在setting里面写 ...
- Java 基础类型 默认值
(1)数据库里的列,如果有默认值,不能赋值有业务含义的值. (2)int 默认值 java会分配默认值的额.
- 使用chcache 缓存
在项目里碰到了表单提交和ajax访问后台取到的request对象不是同一个对象,所以不能够资源共享,问了大神决定配置一个缓存来处理这个问题. 引用jar :ehcache-core-2.5.2.jar ...
- python 基础篇
1.编程语言介绍. 1.机器语言:直接用二进制编程,直接对硬件的控制,需对硬件掌握比较深. 优点:执行效率快 缺点:开发效率低下 2.汇编语言:用英文标签代替二进制编写程序,直接对硬件的控制,需对硬件 ...
- Windows 访问 CentOS 7 共享文件夹 Samba 配置
Windows 使用用户名.密码访问 CentOS 7 共享文件夹 执行命令,查看 Windows 工作组:net config workstation 执行命令,安装 Samba:yum insta ...
- 1.docker 数据卷的备份和恢复(非大数据量)
在生产环境中使用 Docker,很多时候需要对数据进行持久化,或者进行容器间的数据共享. 容器中的管理数据主要有两种方式: 数据卷 (Data Volumes): 容器内数据直接映射到本地主机环境: ...
- Create an Azure SQL database in the Azure portal
Create a SQL database An Azure SQL database is created with a defined set of compute and storage res ...
- Nginx 优先选择连接最少的上游服务器
详见陶辉87课 upstream test { server ; server ; least_conn ; zone backends 64k; }