2024/10/2 CSP-S daimayuan模拟赛复盘

news/2024/10/3 16:30:41

2024/10/2 CSP-S daimayuan

contest link (Day 7)

A. 序列

题面描述

给你一个序列 \(r_1,r_2,\dots,r_n\),问有多少非负整数序列 \(x_1,x_2,\dots,x_n\) 满足:

  • 对于所有 \(i\)\(0 \leq x_i \leq r_i\)

  • 满足 \(x_1|x_2|…|x_n=x_1+x_2+⋯+x_n\),左边为二进制或。

输出答案对 \(998244353\) 取模的结果。

输入 & 输出 & 样例 & 数据范围

输入第一行一个整数 \(n\)

接下来一行,一共 \(n\) 个整数 \(r_1,r_2,\dots,r_n\)

输出一个整数,表示答案。

对于所有数据,保证 \(1 \leq n \leq 16,0 \leq ri < 260\)

5
1 2 3 4 5

思路解析

首先考虑将那个按位或的条件转换一下,可以得到条件等价于要求对于所有的 \((i,j)\) 都有 \(x_i \& x_j=0\),相当于我们查看所有 \(x\) 的第 \(k\) 位,只有一个或没有 \(x\) 在当前位上为 \(1\)。有这种想法后我们就可以想数位 dp,但是在二进制数位下。我们在常规的数位 dp 下需要记录是否有顶头,这里同理,但是需要记录 \(n\) 个元素的信息,因为 \(n\) 的范围较小,用状压存储即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 18, M = 64;
const ll P = 998244353;
ll n, r[N], f[2][1 << N];
int g(ll x, int y) {return (x >> y) & 1; 
}
int main() {cin >> n;for(int i = 1; i <= n; i++) cin >> r[i];f[63 & 1][0] = 1;for(int i = 62; i >= 0; i--) {for(int j = 0; j < (1 << n); j++) f[i & 1][j] = 0;for(int j = 0; j < (1 << n); j++) {int tmp = 0;for(int k = 1; k <= n; k++) {if(g(j, k - 1) || g(r[k], i)) tmp += (1 << (k - 1));}f[i & 1][tmp] += f[(i + 1) & 1][j];for(int k = 1; k <= n; k++) {int top = ((g(j, k - 1) || g(r[k], i)) ? 1 : 0);if(g(j, k - 1) || g(r[k], i)) {int now = ((tmp ^ (1 << (k - 1))) | ((g(j, k - 1)) << (k - 1)));f[i & 1][now] += f[(i + 1) & 1][j]; f[i & 1][now] %= P;}}}}ll ans = 0;for(int j = 0; j < (1 << n); j++) ans = (ans + f[0][j]) % P;cout << ans;return 0;
}

B. 合并数字

题面描述

\(n\) 个数字,\(a_1,a_2,\dots,a_n\)。每次可以选择两个数字 \(x,y\) 删除,然后加入数字 \(K−x−y\)\(n−1\) 轮之后只剩下一个数字,问最后剩下的数字最大可能是多少?

你要对 \(q\) 个不同的 \(K\) 进行回答。每组询问独立,都是对于一开始的序列操作。

输入第一行两个整数 \(n,q\)

接下来一行 \(n\) 个整数 \(a_1,a_2,\dots,a_n\)

接下来一行 \(q\) 个整数 \(K_1,K_2,\dots,K_q\),表示每次询问的值。

输出一共 \(q\) 行,每行一个整数,表示答案。

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

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

相关文章

基于selenium的爬取dblp论文的python爬虫

出于阅读文献的需要,导师让我写一个能够爬取dblp上文献资料的爬虫,话不多说,开学。 学习路径总结前端基本知识 request库与bs库 目标特征,规划爬取步骤 动态加载的应对方法-selenium前端基本知识 前端开发是指创建Web页面或应用程序用户可以与之交互的部分。前端开发主要涉…

探索 java 中的各种锁

Java 8+ -序章 一直听说 java 的各种锁、(线程)同步机制,一直没有深入探索。 最近多看了几篇博文,算是理解的比较深入一些了,特写本文做个记录。ben发布于博客园锁是什么? 一种用于 多个线程运行时协调的机制。 作用如下:ben发布于博客园 1、用于多线程之间同步,比如,…

#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs

这个问题表示在MySQL中,表的一行数据大小超过了最大限制65535字节。这通常是因为表中的某些字段过长导致的。下面是一些解决方法:调整字段类型:将一些较大的字段改为TEXT或BLOB类型。这些类型的存储方式不同于普通字段,可以避免占用过多的行内空间。拆分字段:如果某个字段…

ssh进Windows的一次尝试

1. 配置端口映射 https://chmlfrp.cn/ 1.2 进入管理面板 1.3实名认证(网站声称是阿里云) 1.4下载客户端1.5进入隧道列表添加隧道1.5进入“配置文件”中选择节点生成配置文件并复制 1.6 设置frpc.ini 删除frpc.ini文件,重新建立并粘贴生成的配置文件 1.7 启动 在当前目录下打…

SpringBoot项目使用yml文件链接数据库异常

SpringBoot使用properties连接数据库时没有出现问题 SpringBoot使用yml连接数据库时出现:Unable to connect to Redis 并在报错信息中出现:发现是用户或者密码出现问题 通过查询知道yml是区分数据类型的,所以如果用户名或者密码是数字的话,就要注意将密码用双引号括起来,将…

行列式求法和矩阵树定理

1.矩阵树定理 无向图,有n个点,如果说i-j之间有连边,那么矩阵g[i][j]=g[j][i]=-1(i-j之间的边的数量),否则值为0 矩阵上对角线上的值为该点的度数,g[i][i]=d[i]; 生成树个数:任选i,去掉i行i列之后的行列式的值 生成树的权值=边权的乘积,所有生成树的权值之和? i-j之间右边,g[i]…

git 代码提交规范 commitLink

commitLink 是一个 git 代码提交规范工具,能规范团队成员代码必须按照 规范提交 1、安装依赖:npm install --save-dev @commitlint/config-conventional @commitlint/cli依赖安装完成之后,会生成一个 commitLink.config.js 配置文件 2、安装 kusky ( mpn install .husky/co…

RUST所有权相关问题

先介绍一下RUST的所有权规则: 1.Rust 中的每一个值都有一个所有者(owner)。 2.值在任一时刻有且只有一个所有者。 3.当所有者(变量)离开作用域,这个值将被丢弃。 变量与数据交互的方式包括两种:移动和克隆。 移动就是转交值的所有权,如let x=y(x的类型未实现Copy trait)…