题目大意:

给定T组X,Y,对于每组X,Y,求上面式子   的值,其中  当x为真时等于1,其他情况等于0. 其中

思路:

对X,Y一起进行数位DP,我们把每一位枚举数字的上限以及数字之前是否有前导零(当X,Y枚举到这一位二者都有前导零时才为true)都直接记录到这一位的状态里面,然后在枚举每一位的时候,枚举X,Y在这一位上面所有可能的组合(i,j)。如果i&j为1,那么X&Y就一定不为0,便不会对答案产生贡献,这种情况下的后面若干位就不用枚举了。否则,对答案产生了贡献,由于在X&Y=0的时候二者相加不会进位,所以对答案的贡献就是二者中最高位的1的pos + 1。以此阶段之后枚举的所有合法数字都会产生同样的这一个贡献,所以ans+=dfs()*(pos+1)(之后的数字lead都不会为true,所以这里的dfs返回的实际是合法数字的个数),否则ans+=dfs()(仅统计合法数字的个数,避免重复的计算)。

最后答案为dfs(pos-1,true,true,true)-1(因为0,0不考虑,所以要减去)

由于每次构成dp状态的数字的组成都不一样,所以必须在循环内memset

代码:

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
//#define int LL
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const int maxn = 100010;
const double eps = 1e-6;
const int mod = 1000000007;
const LL MOD = 998244353; int T;
int X, Y;
int x[35], y[35];
LL dp[35][2][2][2];//位,x上限,y上限,前导零
//lead:x,y当前同时有前导零
LL dfs(int pos, bool xlim, bool ylim, bool lead)//把限制直接搞成状态
{
if (pos == -1)
return 1;
if (dp[pos][xlim][ylim][lead] != -1)
return dp[pos][xlim][ylim][lead];
int upx = (xlim ? x[pos] : 1);
int upy = (ylim ? y[pos] : 1);
LL ans = 0;
for (int i = 0; i <= upx; i++)
{
for (int j = 0; j <= upy; j++)
{
if (i & j)
continue;//数字非法,不往下进行枚举
int cnt = 1;
if (lead && (i || j))
cnt = pos + 1;
ans = (ans + dfs(pos - 1, xlim && i == upx, ylim && j == upy, lead && !i && !j) * cnt % mod) % mod;
}
} return dp[pos][xlim][ylim][lead] = ans;
} int calc(int a, int b)
{
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
int pos1 = 0, pos2 = 0;
while (a)
{
x[pos1++] = a % 2;
a >>= 1;
}
while (b)
{
y[pos2++] = b % 2;
b >>= 1;
}
return dfs(max(pos1, pos2) - 1, true, true, true);
} void solve()
{
cout << (calc(X, Y) - 1 + mod) % mod << endl;
} int main()
{
cin >> T;
while (T--)
{
memset(dp, -1, sizeof(dp));
cin >> X >> Y;
solve();
} return 0;
}

2020ICPC上海站 C. Sum of Log的更多相关文章

  1. sqlservr (708) 打开日志文件 C:\Windows\system32\LogFiles\Sum\Api.log 时出现错误 -1032 (0xfffffbf8)

    在windows server 2012 standard上新安装好的SQL Server 2014,查看错误日志,发现此报错 sqlservr (708) 打开日志文件 C:\Windows\sys ...

  2. Path Sum

    需如下树节点求和 5  /  \ 4     8  /     /  \ 11  13    4 / \     /  \  7    2      5   1 JavaScript实现 window ...

  3. awk技巧 nginx access.log

    1.1 介绍 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK ...

  4. the sum of two fixed value

    the sum of two fixed value description Input an array and an integer, fina a pair of number in the a ...

  5. JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  6. JavaScript学习总结(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  7. JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  8. Array的个人总结

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  9. ES6扫盲

    原文阅读请点击此处 一.let和const { // let声明的变量只在let命令所在的代码块内有效 let a = 1; var b = 2; } console.log(a); // 报错: R ...

随机推荐

  1. 集合框架-Map集合-TreeMap存储自定义对象

    1 package cn.itcast.p8.treemap.demo; 2 3 4 import java.util.Iterator; 5 import java.util.Map; 6 impo ...

  2. linux判断物理CPU,逻辑CPU和CPU核数

    ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量,可以数不重复的 physical id 有几个 ② 逻辑CPU Linux用户对 /proc/cpuinfo 这个文件肯定不陌生. ...

  3. 从新建文件夹开始构建ShadowPlay Engine游戏引擎(6)

    本篇序言 在经历了为期很长时间的调试以及思维纠错后,我们可以开始实现我们的内存管理模块了,我在前面说过如果各位要继续跟着学习的话可能会需要一定的计算机组成原理和操作系统的知识,不过在莽代码的过程中,我 ...

  4. Shiro 简单介绍和快速入门。

    一.shiro是啥? /* * Shiro ? 安全框架是一个 1.功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理,并可用于保护任何应用程序 - 从命令行应用程序,移动应用 ...

  5. JavaScript的内存管理

    JavaScript的内存管理 1.什么是内存管理? 在了解JavaScript的内存管理之前,可以先大致熟悉一下什么是内存管理,不管什么样的编程语言,在其代码执行的过程中都是需要为其分配内存的. 不 ...

  6. 「JOISC 2014 Day1」 历史研究

    「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加, ...

  7. JS中的堆内存与栈内存

    在js引擎中对变量的存储主要有两种位置,堆内存和栈内存. 和java中对内存的处理类似,栈内存主要用于存储各种基本类型的变量,包括Boolean.Number.String.Undefined.Nul ...

  8. 自定义CALayer

    1.如何自定义Layer.     自定义CALayer的方式创建UIView的方式非常相似.      CALayer *layer = [CALayer layer];      layer.fr ...

  9. 自定义带图片和文字的Button的排版--陈棚

    自定义button,动态加载图片与文字 [footView addSubview:btnAllChoose]; [btnAllChoose setTitle:str forState:UIContro ...

  10. 洛谷P1563 [NOIP2016 提高组] 玩具谜题

    题目链接:https://www.luogu.com.cn/problem/P1563 哈哈哈,这个题拿来一读是不是很吃惊hahaha,我刚开始读的时候吓了我一跳,这么长的题干,这么绕的题意,还有下面 ...