2020ICPC上海站 C. Sum of Log
题目大意:
给定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的更多相关文章
- sqlservr (708) 打开日志文件 C:\Windows\system32\LogFiles\Sum\Api.log 时出现错误 -1032 (0xfffffbf8)
在windows server 2012 standard上新安装好的SQL Server 2014,查看错误日志,发现此报错 sqlservr (708) 打开日志文件 C:\Windows\sys ...
- Path Sum
需如下树节点求和 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1 JavaScript实现 window ...
- awk技巧 nginx access.log
1.1 介绍 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK ...
- 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 ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript学习总结(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- Array的个人总结
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- ES6扫盲
原文阅读请点击此处 一.let和const { // let声明的变量只在let命令所在的代码块内有效 let a = 1; var b = 2; } console.log(a); // 报错: R ...
随机推荐
- 通俗易懂详解iptables
防火墙相关概念 从逻辑上讲.防火墙可以大体分为主机防火墙和网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网. ...
- 在build中配置resources,来防止我们资源导出失败的问题
<!--在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> <resource> < ...
- 什么是以特性为核心的持续交付|阿里巴巴DevOps实践指南
编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...
- Go语言切片一网打尽,别和Java语法傻傻分不清楚
前言 我总想着搞清楚,什么样的技术文章才算是好的文章呢?因为写一篇今后自己还愿意阅读的文章并不容易,暂时只能以此为目标努力. 最近开始用Go刷一些题,遇到了一些切片相关的细节问题,这里做一些总结.切片 ...
- visual studio版本 宏
转载请注明来源:https://www.cnblogs.com/hookjc/ MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) MSVC++ 11. ...
- NSString 类介绍及用法
1.NSString常见方法 NSString是 Objective-C 中核心处理字符串的类之一 创建常量字符串,注意使用"@"符号. NSString *astring = @ ...
- Apache Http Server与Tomcat6 的负载均衡(二)
一般来说,实现Apache与Tomcat6的负载均衡有两种方式,一种是使用mod_jk,另一种是使用mod_proxy模块.本文只讨论mod_jk方式. 无论使用哪种方式,一般都要经过以下这几个步骤( ...
- 无脑安装——Python 及 安装python集成开发环境pycharm
无脑安装--Python 及安装python集成开发环境pycharm 1.真机安装python 2.安装python集成开发环境pycharm Python 是一种解释型语言 Python 是面向对 ...
- SQLServer、Mysql、Oracle 创建、删除用户和授予用户权限
SQLServer 1.创建用户 CREATE LOGIN [用户名称] WITH PASSWORD='用户密码', DEFAULT_DATABASE=[默认数据库名称], CHECK_EXPIRAT ...
- Linux源码编译安装php7.2
以下简单的介绍下如何源码安装PHP,对于版本不一定是7.2,也可以是7.3,当然方法都是换汤不换药的,核心东西不变. 一.下载PHP源码 需要到指定的路径下载源码,执行下面的命令 wget http: ...