传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

观察可以发现,由于i&j=0i \And j=0i&j=0,所以log2(i+j)log_2(i+j)log2​(i+j)表示的应该是i+ji+ji+j的111的最高位。
一个显然的dpdpdp状态就出来了f[pos][flag1][flag2][maxlen]f[pos][flag1][flag2][maxlen]f[pos][flag1][flag2][maxlen]表示到了pospospos位,flag1,flag2flag1,flag2flag1,flag2分别表示x,yx,yx,y是否能选到上界,maxlenmaxlenmaxlen就是最高位。这个的复杂度是30∗2∗2∗3030*2*2*3030∗2∗2∗30的,由于T≤1e5T\le 1e5T≤1e5,而且只给了1s1s1s,这个显然会TTT的很惨,所以考虑如何优化。
如果我们去掉maxlenmaxlenmaxlen之后,f[pos][flag1][flag2]f[pos][flag1][flag2]f[pos][flag1][flag2]求出来的是什么呢?是满足i&j=0i\And j=0i&j=0的数的个数,由于最高位也是数的一个特征,所以想要在dpdpdp中维护是不太可能的事情了,考虑每一位只有可能是i,ji,ji,j当中的一个为111,那么我们可以通过枚举最高位是111,让后用去掉maxlenmaxlenmaxlen的dpdpdp算出有多少个,之后乘上长度不就行啦,这样求一次的复杂度就降为30+30∗2∗230+30*2*230+30∗2∗2了,就可以稳过辣。

// Problem: Sum of Log
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/9925/C
// Memory Limit: 2097152 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int x,y;
LL f[31][2][2];
int a[100],b[100];LL dp(int pos,int flag1,int flag2) {if(pos==-1) return 1;if(f[pos][flag1][flag2]!=-1) return f[pos][flag1][flag2];int x=flag1? 1:a[pos];int y=flag2? 1:b[pos];LL ans=0;for(int i=0;i<=x;i++) {for(int j=0;j<=y;j++) {if(i==1&&j==1) continue;ans+=dp(pos-1,flag1||i<x,flag2||j<y);ans%=mod;}}return f[pos][flag1][flag2]=ans;
}void solve() {for(int i=30;i>=0;i--) {a[i]=x>>i&1;b[i]=y>>i&1;}
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; cin>>_;while(_--) {memset(f,-1,sizeof(f));scanf("%d%d",&x,&y); solve();int len1=(int)log2(x),len2=(int)log2(y);LL ans=0;for(int i=0;i<=len1;i++) ans+=dp(i-1,i<len1,i<=len2)*(i+1),ans%=mod;for(int i=0;i<=len2;i++) ans+=dp(i-1,i<=len1,i<len2)*(i+1),ans%=mod;printf("%lld\n",ans);}return 0;
}
/**/

2020 ICPC 上海 Sum of Log 数位dp + 状态剪枝相关推荐

  1. 数位dp ---- 2020 icpc 上海 Sum of Log(枚举高位的二进制数位dp)

    题目链接 题目大意 : 解题思路: 这里有个很核心的地方就是log2(i+j)\text{log2(i+j)}log2(i+j)本质上就是看看i+j\text{i+j}i+j的二进制高位在哪里? 那么 ...

  2. 2020ICPC(上海) - Sum of Log(数位dp)

    题目链接:点击查看 题目大意:给出 X 和 Y,求  题目分析:因为涉及到了位运算且看似可以递推,所以考虑数位dp,因为统计答案时的 i 和 j 的与为 0,所以 i + j = i & j, ...

  3. 2020 ICPC上海 题解

    G Fibonacci 经典 奇奇偶奇奇偶奇奇偶 答案自然为Cal(n,2) - Cal(n-n/3,2) 6s ac真的很快啊! M Gitignore 建树标记,然后跑个dfs就行 一开始没考虑同 ...

  4. 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. 组合计数 ---- 2020 icpc 上海 The Journey of Geor Autumn(思维划分问题计数+预处理优化)

    题目链接 题目大意: 就是你有一个nnn的全排列,现在问你去重排这个排列使得对于给定的kkk,满足对于任意的ai,i>ka_i,i>kai​,i>k的都有ai>min(ai−1 ...

  6. 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)

    题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...

  7. Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化

    传送门 文章目录 题意: 思路: 题意: 思路: 数位dpdpdp挺经典的一个题辣,有一个很明显的状态就是f[pos][num][lcm]f[pos][num][lcm]f[pos][num][lcm ...

  8. 对数位dp的一些拙见

    这不是一篇介绍数位dpdpdp的文章,只是我思考后的一些记录,怕以后就忘记了. 由于博主太菜不会组合数学,以下数位dpdpdp均采用记忆化搜索的方式. 首先最重要的就是状态设计了,正常来说数位dpdp ...

  9. HDU 4352 XHXJ's LIS(*数位DP 记忆化搜索 待整理)

    XHXJ's LIS HDU - 4352 #define xhxj (Xin Hang senior sister(学姐))  If you do not know xhxj, then caref ...

最新文章

  1. java 按钮不显示文字_java – 使JButton中的文本不可见
  2. java fork_浅谈Java的Fork/Join并发框架
  3. web数据库连接注意事项
  4. HDU 5115 Dire Wolf 区间dp
  5. java 内存_java节省内存的几条建议
  6. bootstrap 中这段代码 使bundles 失败
  7. 打印时候复选框勾选不见了_checkbox 选中未显示对号勾选的问题
  8. webkitlineclamp css3,-webkit-line-clamp
  9. 收藏 | 程序员生涯指南,在GitHub上获3.6万星
  10. Android含文档server结束(client UI接口异步请求的一部分)三
  11. MariaDB设置root用户密码
  12. 一位 JavaScript 铁杆粉眼中的 Rust!
  13. 前端复习笔记(三)——JavaScript和JQuery
  14. 【Proteus仿真】 51单片机利用定时器制作简易SPWM波形输出
  15. vue3笔记(乱七芭蕉更新中)
  16. 开源项目_C语言学生个人信息管理系统课程设计_chenjie的博客
  17. Android 模拟器横屏竖屏切换设置
  18. 4.23以上UE4 版本HTC-VIVE VR项目打包的注意事项
  19. OpenJudge 2986 拼点游戏
  20. 谷歌提出MaskGIT:掩码生成图像Transformer

热门文章

  1. bigint hive java类型_详解Apache Hudi如何配置各种类型分区
  2. mfc怎么改按钮的按下状态_【荐读】马桶上一大一小的按钮该怎么按?原来这些年都错了...
  3. 会按摩的充气颈枕,只占行李箱一个角,却能让你的脖子爽到爆
  4. 从概念到案例,机器学习应该掌握的20个知识点
  5. 服务器的类型及作用是什么,按用途分类,服务器有哪些? - 问答库
  6. jdbc mysql user_tab_comments_mysql/jdbc:设置useInformationSchema=true读取表注释信息(table_comment)...
  7. delphi 关闭时缩小到托盘_delphi 实现最小化系统托盘
  8. 树莓派能直接运行python程序_树莓派怎么运行python程序
  9. 传递集合对象_面试必备——Java集合框架
  10. linux自动跑批,在linux中添加硬盘并在系统启动时自动挂载