原文链接https://www.cnblogs.com/cly-none/p/9695526.html

题意:求有多少对集合\(S,T\)满足:\(S \subseteq \{1,2...n \}, T \subseteq \{1,2...m\},S \bigcap T = \emptyset\),且\(S\)中所有元素的异或和小于\(T\)中所有元素的异或和。对\(10^9+7\)取模。

\(n,m \leq 2000\)

首先,通过记录当前两个集合的异或和,转移时考虑每个元素的3种选择,容易得到\(O(n^3)\)的暴力dp。然而,要对此优化却是一件困难的事情。

但无论如何,对状态的优化的必要的。因此,我们就必须避免同时记录两个集合的异或和。考虑两个异或和如果只有一位,那么它们的大小关系就能通过记录一位来得到。而对于多位的二进制数的大小比较,我们也只用比较不同的最高位就可以了。

因此,我们枚举不同的最高位。那么,我们就可以忽略后面的位,并只用记录我们所枚举的这一位。剩下的问题就在于保证更高的位是相等的。那可以用记录两个数在更高位上的异或和实现,异或和为0,这两个数就是相等的。

时间复杂度\(O(n^2\log n)\)。

upd18.9.25

确实如zhouzhendong所说,这是\(O(n^2)\)的。下面代码已修改。

#include <bits/stdc++.h>
using namespace std;const int N = 2060, MOD = (int)(1e9 + 7);
int dp[N][N][2],n,m,len,ans;class WinterAndSnowmen {
public:int getNumber( int N, int M );
};
int WinterAndSnowmen::getNumber(int N, int M) {n = N, m = M;len = max(n,m);for (int s = 1 ; s <= 12 ; ++ s) {memset(dp,0,sizeof dp);dp[0][0][0] = 1;for (register int i = 1 ; i <= len ; ++ i) {for (register int j = 0 ; j < (2048 >> (s-1)) ; ++ j) {for (int k = 0 ; k < 2 ; ++ k) {if (i <= n)(dp[i][j^(i>>(s-1))][k] += dp[i-1][j][k]) %= MOD;if (i <= m)(dp[i][j^(i>>(s-1))][k ^ ((i >> (s-1))&1)] += dp[i-1][j][k]) %= MOD;(dp[i][j][k] += dp[i-1][j][k]) %= MOD;}}}(ans += dp[len][1][1]) %= MOD;}return ans;
}

小结:虽然是“思维训练”中的题,但也会有自己没有掌握的技巧。

转载于:https://www.cnblogs.com/cly-none/p/9695526.html

【做题】TCSRM601 Div1 500 WinterAndSnowmen——按位考虑dp相关推荐

  1. C++ 牛客网做题笔记【500题总结】

    1:要判断一个双精度的浮点数double是否等于0,应使用abs(f) <= 1e^15 而不是 f == 0, 2:内存中的全局域的常量字符串放在文字常量区 3:JAVA不使用指针,被封装起来 ...

  2. bzoj5108 [CodePlus2017]可做题 位运算dp+离散

    [CodePlus2017]可做题 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 87  Solved: 63 [Submit][Status][D ...

  3. 一位粗心的同学在用计算机计算某题时,浅谈如何纠正小学生在数学中做题粗心的问题...

    浅谈如何纠正小学生在数学中做题粗心的问题 宝塔区南关小学课题组 李 乐 摘 要:粗心,是孩子的通病,低年级学生尤为突出.粗心问题是学生错题.导致学习成绩不好的最主要原因,如何纠正学生做题粗心的问题,是 ...

  4. 纪中DAY15做题小结

    纪中DAY15做题小结 T1:淘汰赛制 T2:方程的解 T3:物流运输 T4:矩阵乘法(mat) T1:淘汰赛制 Description 淘汰赛制是一种极其残酷的比赛制度.2 ^ n名选手分别标号1, ...

  5. CF/TC 做题计划

    因为智商太低了所以决定靠做多一点题来拯救一下自己... 欢迎催更...尽量保持一天2~3题...? 3.15 突然颓废了....怎么办啊QAQAQAQ 3.20 做点easy或者medium冷静一下. ...

  6. 纪中DAY8做题小结

    纪中DAY8做题小结 T1:少女觉 T2:灵知的太阳信仰 T3:多段线性函数 T4:DY引擎 T1:少女觉 Description 在幽暗的地灵殿中,居住着一位少女,名为古明地觉. 据说,从来没有人敢 ...

  7. 程序员专访:钱就是命!“小镇做题家”的成长与救赎

    文 /Iris是外星人 今天是程序员节,我约了我的一位程序员朋友做了个专访,本来想聊聊程序员都是怎么赚钱的,没想到却收获了更多"意外"的故事.与大家分享,也请大家多支持我的内容哦. ...

  8. AI学高数达到MIT本科水平,学了微积分线性代数概率论等6门课,不光能做题还能出题...

    梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 让语言模型做数学题,有多难? 强如GPT-3,在9-12岁的小学数学上,第一次才考20多分. 去年底GPT-3用上新方法努力了很久终于拿到5 ...

  9. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

最新文章

  1. ZULUTrade骗局揭秘--一名福汇员工的良心发现
  2. mate40能更新鸿蒙,Mate40领衔更新!鸿蒙系统首批升级机型名单:这些机型可坐等推送...
  3. 网络配置之ifconfig及Ip命令详解
  4. 部署webservice到远程服务器
  5. 喝酒划拳中的数学(附:摇号)
  6. 城市公交网建设问题(信息学奥赛一本通-T1348)
  7. 在PHP代码中处理JSON 格式的字符串的两种方法:
  8. Golang学习 - sync 包
  9. DB9接口详解---DB9引脚在 UART,CAN,RS485中的定义
  10. 3. Spring Boot 从零开始学习
  11. httpwatch11.1---专业版
  12. AutoCAD 系统变量
  13. 小米商城app端项目
  14. 大整数乘法(Karatsuba算法的字符串形式的C++实现)
  15. Learning Typography for Video Editors 学习视频编辑的排版 Lynda课程中文字幕
  16. mysql数据库多实例启动_Mysql多实例运行
  17. 给一条直线和一个椭圆的方程,它们相交于两点,求交点与原点所构成的三角形的面积的最大值
  18. 1131 Subway Map
  19. Java面向对象编程——抽象类和接口
  20. 生物学和计算机科学结合的学科,美国生物信息学和计算生物学解析

热门文章

  1. cmake的使用-if-else的逻辑流程详解
  2. 高级C语言教程-存储器和指针
  3. python的set结构
  4. 【CyberSecurityLearning 58】PHP代码注入
  5. IO多路复用之select篇
  6. 全局描述符表(GDT)——《x86汇编语言:从实模式到保护模式》读书笔记09
  7. Mybatis学习总结二
  8. JVM_03 运行时数据区[ 堆 ]
  9. JS:js 数组赋值问题 :值传递还是引用?
  10. zcmu1716(思维)