题目大意:

给定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. %r和%s的区别

    理解%r和%s的区别 %r会重现所表达的对象,%s会将所有转成字符串 eg1: print('i am %s years old' % 22) print('i am %r years old' % ...

  2. LoadRunner编写socket性能测试脚本

    利用LoadRunner编写socket性能测试脚本 一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socke ...

  3. 如何在pyqt中实现平滑滚动的QScrollArea

    平滑滚动的视觉效果 Qt 自带的 QScrollArea 滚动时只能在两个像素节点之间跳变,看起来很突兀.刚开始试着用 QPropertyAnimation 来实现平滑滚动,但是效果不太理想.所以直接 ...

  4. 洛谷 8 月月赛 & 「PMOI」Round · 04

    T1 T166167 「PMOI-4」人赢 题目大意 给一个数列的前两项分别为\(n\)和\(m\) 当\(i\geq3\)时\(a_i = a_{i-1}*a_{i-2}\)的个位 给定\(n\), ...

  5. python编写购物车

    上次的学习又没有坚持下来,工作忙的不可开交,但我反思了一下还是自己没有下定决心好好学习,所以这次为期3个月的学习计划开始了,下面是这次学习后重新编写的购物车初版代码. 1 # 功能要求: 2 # 要求 ...

  6. JS 高阶函数

    笔记整理自:廖雪峰老师的JS教程 目录 概述 Array中的高阶函数 map(返回新的Array) reduce(返回新的Array) filter(返回新的Array) sort(返回同一Array ...

  7. sms短信网关对接

    因为工作的需求,需要对接短信网关,业务上就是一个注册用户时,需要发送手机验证码;可能别的公司都是使用第三方接口,但是大点的公司,为了安全,他们都有自己的短信消息中心(SMSC) 1.业务需求 - 1. ...

  8. Java线程--BlockingQueue使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871704.html Java线程--BlockingQueue使用 阻塞队列就是内容满了之 ...

  9. 把 Navigation Bar 下面那条线删掉的最简单的办法! — By: 昉

    系统默认的 Navigation Bar 下面一直有条线,翻尽了文档却没找到能把它弄走的相关接口,处女座的简直木法忍啊有木有!!!! 研究了一下navigationBar下的子视图,原来只需要几行代码 ...

  10. Solution -「AGC 036D」「AT 5147」Negative Cycle

    \(\mathcal{Descriprtion}\)   Link.   在一个含 \(n\) 个结点的有向图中,存在边 \(\lang i,i+1,0\rang\),它们不能被删除:还有边 \(\l ...