The 2022 CCPC Guangzhou Onsite M. XOR Sum(数位dp 数位背包)

news2025/4/3 0:57:53

题目

给定n,m,k(0<=n<=1e15,0<=m<=1e12,1<=k<=18),

求长度为k的数组a,ai为[0,m]的整数,

满足\sum_{i=1}^{k}\sum_{j=1}^{i-1}a_{i}\bigoplus a_{j}=n的方案数

答案对1e9+7取模

题解

第一反应想起了hdu3693,但比对了一下,感觉那个题难很多,

两年前写的题忘了写题解,现在不会了

Educational Codeforces Round 104 (Rated for Div. 2) F.Ones(数位dp)_Code92007的博客-CSDN博客

后来想了想,感觉更像这个题,按余数统计方案数,

控制余数在一定范围,姑且称它为数位背包

每一位的贡献可以独立考虑,而这个式子实际是(i,j)对的01值不同就会产生贡献,

所以只用关注当前几个填1几个填0,由于有的卡上界有的不卡,所以记录一下当前有几个卡上界

dp[i][j][l]表示当前从高到低考虑到低i位时,只考虑n的i位及更高位时的数的当前余数是j,选的l个数卡上界的方案数

k=18时,最大贡献是9*9=81,考虑当前n的余数x最大能是多少,

(x-81)*2<x,表示本位取了81之后,下一位的余数小于81,解得x<162,

所以转移过程中可以忽略>162的转移,因为通过更低的位,再也不能使其归0

而<0的转移也不可取,

因为这个操作,转移到下一位,相当于*2,下一位n有余数,相当于+1,

还有减去当前选的值,相当于减去一个非负数,而(-1)*2+1还为-1,最终不能变为0

所以,可以只关注[0,162)的转移,代码中写的是[0,256)

此外,初始局面时,n的余数超过256也显然无解

转移分两种情况讨论,当前位为0 或者 当前位为1

1. 当前位为0,卡上界的只能选0,for枚举不卡上界的数中选了x个1

2. 当前位为1,for枚举卡上界的数中选了x个1,for枚举不卡上界的数中选了y个1

选出这些数来,从而确定了贡献数对的数量,也确定了下一次卡上界的数的个数,

并算出下一位的n的当前余数,递归到子状态搜索即可

复杂度O(40*256*18*18*18),但跑不满

注意特判k=1(取不出两个数)和m=0(a数组为空)的情况

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=42,M=256,K=19,mod=1e9+7;
ll n,m,dp[N][M][K],c[K][K];
int k,a[N];
ll dfs(int x,int r,int cur){
	if(r>=M)return 0;
	if(x==-1)return r==0;
	if(~dp[x][r][cur])return dp[x][r][cur];
	ll &ans=dp[x][r][cur];ans=0;
	int nb=(x==0?0:(n>>(x-1)&1));
	//printf("x:%d ax:%d\n",x,a[x]);
	if(a[x]==0){
		for(int i=0;i<=k-cur;++i){
			int nr=r-i*(k-i);
			if(nr<0)continue;
			ans=(ans+1ll*c[k-cur][i]*dfs(x-1,(nr<<1)|nb,cur)%mod)%mod;
		}
	}
	else{
		for(int i=0;i<=cur;++i){
			for(int j=0;j<=k-cur;++j){
				int nr=r-(i+j)*(k-(i+j));
				//printf("x:%d r:%d cur:%d i:%d j:%d nr:%d\n",x,r,cur,i,j,nr);
				if(nr<0)continue;
				ans=(ans+1ll*c[cur][i]*c[k-cur][j]%mod*dfs(x-1,(nr<<1)|nb,i)%mod)%mod;
			}
		}
	}
	//printf("x:%d r:%d cur:%d ans:%lld\n",x,r,cur,ans);
	return ans;
}
ll cal(){
	if(k==1)return !n;
	if(!m)return !n;
	memset(dp,-1,sizeof dp);
	int c=0;
	for(ll x=m;x;x>>=1){
		a[c++]=x%2;
	}
	ll rn=0;
	for(int i=c;i<=50;++i){
		if(n>>i&1){
			rn+=1ll<<(i-c);
			if(rn>=M)return 0;
		}
	}
	return dfs(c,(int)rn,k);
}
int main(){
	c[0][0]=1;
	for(int i=1;i<K;++i){
		c[i][0]=c[i][i]=1;
		for(int j=1;j<i;++j){
			c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
		}
	}
	cin>>n>>m>>k;
	cout<<cal()<<endl;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一看就会的Java方法

文章目录一、方法的定义和使用&#x1f351;1、为什么引入方法&#xff1f;&#x1f351;2、方法的定义&#x1f351;3、方法调用的执行过程&#x1f351;4、实参和形参的关系二、方法重载&#x1f351;1、为什么需要方法重载&#x1f351;2、方法重载的概念和特点&#x1f351…

四旋翼无人机学习第8节--OpenMV电路分析

这里写目录标题0 前言1 openmv优秀作品介绍2 stm32单片机原理图绘制3 stm32单片机外接电容分析3 stm32单片机外接电容绘制4 stm32单片机外接晶振分析5 stm32单片机外接晶振绘制6 stm32单片机复位电路分析7 stm32单片机复位电路设计0 前言 简单的说一下&#xff0c;openmv模块是…

微信小程序 | 吐血整理的日历及日程时间管理

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏&#xff01;从个人到商业的全套开发教程&#xff0c;实打实的干货分享&#xff0c;确定不来看看&#xff1f; …

关于宝宝过敏原检测的这几点,专家达成共识啦

随着传染病发病率的下降&#xff0c;儿童过敏性疾病的发病率逐年上升&#xff0c;引起了公众和医务人员的广泛关注。四川省妇幼保健医院检验科目前可进行过敏原检测。根据超敏反应的发生机制和临床特点&#xff0c;可分为四种类型。我们所谓的过敏原检查是特异性的IgE相关的Ⅰ超…

React源码之Fiber架构

对于Fiber我们可以理解为存储在内存中的Dom 对于React15在render阶段的reconcile是不可打断的&#xff0c;如果在操作大量的dom时&#xff0c;会存在卡顿&#xff0c;因为浏览器将所有的时间都交给了js引擎线程去执行&#xff0c;此时GUI渲染线程被阻塞&#xff0c;导致页面出现…

PyTorch搭建循环神经网络(RNN)进行文本分类、预测及损失分析(对不同国家的语言单词和姓氏进行分类,附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言~~~ 下面我们将使用循环神经网络训练来自18种起源于不同语言的数千种姓氏&#xff0c;并根据拼写方式预测名称的来源。 一、数据准备和预处理 总共有18个txt文件&#xff0c;并且对它们进行预处理&#xff0c;输出如下 部分预处理…

Windows版Ros环境的搭建以及Rviz显示激光点云信息

安装步骤&#xff1a; 1.安装visual studio 2019-2022 2.安装ROS 3.创建ROS快捷终端 4.运行测试效果 一、安装Visual Studio 2022 需要利用vs编译ROS代码&#xff0c;所以需要安装Visual Studio 2022 这里注意要使用vs2022&#xff0c;ROS wiki给的教程是使用2019 1).使…

Python学习小组课程-课程大纲与Python开发环境安装

一、前言 注意&#xff1a;此为内部小组学习资料&#xff0c;非售卖品&#xff0c;仅供学习参考。 为提升项目落地的逻辑思维能力&#xff0c;以及通过自我创造工具来提升工作效率&#xff0c;特成立Python学习小组。计划每周花一个小时进行在线会议直播学习&#xff0c;面向…

力扣21 - 合并两个有序链表【归并排序思维】

链式铠甲——合体一、题目描述二、思路分析三、代码详解way1【不带头结点】way2【带头结点】四、整体代码展示【需要自取】方法一&#xff1a;不带哨兵位【无头结点】方法二&#xff1a;带哨兵位【有头结点】五、总结与提炼一、题目描述 原题传送门&#x1f6aa; 将两个升序链…

vs2019编译ffmpeg4.4为静态库或动态库

参考文章&#xff1a;vs2019编译ffmpeg源码为静态库动态库【完整步骤、亲测可行】 文章目录编译测试编译 直接把博主的项目下下来 我打开里面FFmpeg文件发现它貌似是4.4版本 然后照着他给的步骤执行命令 先找到vs2019的命令行工具 然后执行两个脚本 执行以上两个脚本后&…

快速排序和归并排序非递归的详解

在经过主页中《八大排序》&#xff08;下&#xff09;的学习&#xff0c;我们了解了快速排序和归并排序且都是递归的思想&#xff0c;但是如果递归的深度很深呢&#xff1f;这一节我们就引出用非递归的思想解决这个问题。&#x1f635;&#x1f635;&#x1f635; 快速排序非递…

根据给定数组,创建形状相同的数组并且采用不同方式填充full_like()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 根据给定数组&#xff0c;创建形状相同的数组 并且采用不同方式填充 full_like() [太阳]选择题 对下面代码中full_like函数结果描述错误的选项为&#xff1f; import numpy as np print(&q…

谷粒学院——Day05【后台系统前端项目创建、讲师管理模块前端开发】

后台系统前端项目创建 一、vue-element-admin 简介 vue-element-admin 是基于 element-ui 的一套后台管理系统集成方案。 功能&#xff1a;https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 GitHub地址&#xff1a;https://github.com/PanJiaChen/vue-ele…

分布式锁_Redis分布式锁+Redisson分布式锁+Zookeeper分布式锁+Mysql分布式锁(原版)

分布式锁_Redis分布式锁Redisson分布式锁Zookeeper分布式锁Mysql分布式锁&#xff08;原版&#xff09; 文章目录分布式锁_Redis分布式锁Redisson分布式锁Zookeeper分布式锁Mysql分布式锁&#xff08;原版&#xff09;1. 传统锁回顾1.1. 从减库存聊起1.2. 环境准备1.3. 简单实现…

Dreamweaver网页设计与制作100例——HTML5期末考核大作业——票务网站整套网页

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

正确查询DO基站IP

对于DO站的IP地址在系统中设置是否正确需要确定基站侧IP地址和RNC侧地址是否匹配&#xff0c;匹配关系为&#xff1a;基站侧IP地址减2即为RNC侧地址&#xff08;如&#xff1a;RCS 234 BTS-IP: 6.33.84.30 则匹配RNC侧地址即为6.33.84.28&#xff09;&#xff0c;下面举例进行襄…

基于单片机的语音小车设计

目 录 引言 1 1 系统概述 1 1.1 声控产品前景和发展趋势 1 1.2 研究目的和意义 1 1.3 本次设计内容 2 2 系统设计的整体方案 2 2.1 主控芯片的方案论证 2 2.2 语音识别模块的方案论证 3 2.3 电机驱动方案选择 4 2.4 本章小节 4 3 系统…

使用ssh克隆GitHub仓库以及替换https方式

目录 使用ssh克隆GitHub仓库 第一步&#xff1a;生成ssh 第二步&#xff1a;添加SSH key 第三步&#xff1a;验证绑定是否成功 第四步&#xff1a;克隆 意外的情况&#xff1a; 情况1&#xff1a;ssh连接GitHub失败 情况2&#xff1a;使用git clone 不成功 替换原来的…

队列的简单实现

队列的简单实现一、什么是队列二、队列的分类三、队列的数据结构四、队列的基本操作1、初始化队列2、销毁队列3、入队4、出队5、队列判空6、获取队头元素7、获取队尾元素8、获取队列元素总结头文件基本操作一、什么是队列 首先我们既然想要实现队列就得明白什么是队列&#xff…

1.7.4、计算机网络体系结构中的术语

1.7.4、计算机网络体系结构中的术语 1.7.4.1、实体 实体&#xff1a; 任何可发送或接收信息的硬件或软件进程。 对等实体&#xff1a; 收发双方相同层次中的实体 1.7.4.2、协议 协议&#xff1a;控制两个的对等实体进行逻辑通信的规则的集合 之所以称为逻辑通信&#xf…