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的更多相关文章

  1. [SRM603] WinterAndSnowmen

    Description Sol 设 \(A=\text{XOR}(X)\),\(B=\text{XOR}(Y)\). 因为 \(A<B\),所以写下他们的二进制表示,一定是最高的几位先是相等,紧 ...

  2. 【做题】TCSRM601 Div1 500 WinterAndSnowmen——按位考虑&dp

    原文链接https://www.cnblogs.com/cly-none/p/9695526.html 题意:求有多少对集合\(S,T\)满足:\(S \subseteq \{1,2...n \}, ...

  3. SRM 601(1-250pt,500pt)

    DIV1 250pt 题意:有很多袋子,里面装有苹果和橘子(也可能没有),给出每个袋子里有多少个苹果,多少个橘子.如果每个袋子里含有水果的总数都不小于x个,则可以从每个袋子里都拿出x个水果(拿出苹果和 ...

  4. SRM 601 DIV1

    A 枚举x , 然后对于确定的x , 最后总的apple数对应了唯一的orange数,因此问题转化为求apple的取值范围; apple的取值范围: max为每个bag取最多的apple , min为 ...

  5. 来自多校的一个题——数位DP+卡位

    n<=1e9就要考虑倍增.矩阵乘法这种了 假设L=0 考虑枚举二进制下,所有X与R的LCP长度,前len高位 对于第len+1位,假设R的这一位是1 如果一个x的这一位是0了,那么后面可以随便填 ...

  6. Topcoder SRM 601 div1题解

    日常TC计划- Easy(250pts): 题目大意:有n个篮子,每个篮子有若干个苹果和橘子,先任取一个正整数x,然后从每个篮子中选出x个水果,把nx个水果放在一起,输出一共有多少种不同的组成方案.其 ...

随机推荐

  1. C# Note26: [MethodImpl(MethodImplOptions.Synchronized)]与lock机制

    在进行.NET开发时,经常会遇见如何保持线程同步的情况.在众多的线程同步的可选方式中,加锁无疑是最为常用的.如果仅仅是基于方法级别的线程同步,使用System.Runtime.CompilerServ ...

  2. element-ui 源码解析 一

    Button组件 button.vue <template> <button class="el-button" @click="handleClick ...

  3. Django--ORM和单表查询

    一 . ORM ORM是“对象-关系-映射”的简称.(Object Relational Mapping,简称ORM) 二. 单表操作 要想将模型转为mysql数据库中的表,需要在setting里面写 ...

  4. Java 基础类型 默认值

    (1)数据库里的列,如果有默认值,不能赋值有业务含义的值. (2)int 默认值 java会分配默认值的额.

  5. 使用chcache 缓存

    在项目里碰到了表单提交和ajax访问后台取到的request对象不是同一个对象,所以不能够资源共享,问了大神决定配置一个缓存来处理这个问题. 引用jar :ehcache-core-2.5.2.jar ...

  6. python 基础篇

    1.编程语言介绍. 1.机器语言:直接用二进制编程,直接对硬件的控制,需对硬件掌握比较深. 优点:执行效率快 缺点:开发效率低下 2.汇编语言:用英文标签代替二进制编写程序,直接对硬件的控制,需对硬件 ...

  7. Windows 访问 CentOS 7 共享文件夹 Samba 配置

    Windows 使用用户名.密码访问 CentOS 7 共享文件夹 执行命令,查看 Windows 工作组:net config workstation 执行命令,安装 Samba:yum insta ...

  8. 1.docker 数据卷的备份和恢复(非大数据量)

    在生产环境中使用 Docker,很多时候需要对数据进行持久化,或者进行容器间的数据共享. 容器中的管理数据主要有两种方式: 数据卷 (Data Volumes): 容器内数据直接映射到本地主机环境: ...

  9. 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 ...

  10. Nginx 优先选择连接最少的上游服务器

    详见陶辉87课 upstream test { server ; server ; least_conn ; zone backends 64k; }