2023牛客暑期多校训练营7

news2024/11/24 2:40:46

M.Wring Books

问从1到n所有数的数位加起来一共是多少

假设n为1025

我们分别从个位,十位,百位,...考虑

对于个位,1到1025每个数都有个位,所以加1025

对于十位,1到1025中1到9没有十位,所以加1025-9

对于百位,1到1025中1到99没有百位,所以加1025-99

对于千位,1到1025中1到999没有千位,所以加1025-999

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cstdio>
#define endl '\n'
using namespace std;
typedef long long ll;
void solve(){
    int x;
    cin>>x;
    string s=to_string(x);
    int len=s.size()-1;
    ll res=x;
    int t=9;
    for(int i=1;i<=len;i++){
        res+=x-t;
        t=t*10+9;
    }
    cout<<res<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

C.Beautiful Sequence

找到b[i]的最高位的1,由于b[i]=a[i]^a[i+1],又因为数组a非降序,所以a[i]的该位肯定是0(a[i]和a[i+1]的该位一位是0一位是1,又因为数组非降序)

然后根据将b[1],b[2],...b[i-1]全部异或起来,比如说

 

b[1],b[2],b[3],b[4],b[5]全部异或起来,然后中间a[2],a[3],a[3],a[4]都被抵消了,只剩下a[1]和a[5]的异或了,然后a[5]的某一位已经确定为0了,所以就能确定a[1]的这一位了

如果a[1]确定了,我们就能通过递推关系确定整个a序列,所以我们的任务就是确定a[1]

对于a[1]没有确定的位,我们就自己填充,具体解释见注释

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdio>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N],b[N];
int space[31];
int n,k;
//求x的最高位的1是第几位
inline int highbit(int x) {
    //从2^30开始,即第31位开始,不断左移,如果遇到哪一位为1,就返回是第几位
    for(int t=1<<30,cnt=31; t>0; t>>=1,cnt--) {
        if(x&t) return cnt;
    }
    return -1;
}
void solve() {
    memset(space,0,sizeof space);
    cin>>n>>k;
    for(int i=1; i<n; i++) cin>>b[i];
    for(int i=1; i<n; i++) {
        if(highbit(b[i])!=-1&&space[highbit(b[i])]==0) space[highbit(b[i])]=i;//假设space[cnt]为x,a[i]的第x位必定是0
    }
    k--;//k为1的时候第一小的二进制数是0000,k为2的时候第二小的二进制数是0001,以此类推
    //所以k--得到的二进制数就是我们要填充的未确定的位
    int pos=1;
    a[1]=0;//初始a[1]设为0,表示一位都没有填充,没有填充每一位都为0
    //i从1开始乘2,小于等于2^29,a数组和b数组最高达不到2^29,29位就足够了
 //那么为什么不能到30位呢,因为a数组和b数组都达不到30位,当k为2^30时,pos到达2^30,导致a[1]+=2^30并成功输出a数组,但是a并没有第30位,导致错误
    //cnt即表示第几位(最低位为1,右边为低位),从最低位枚举到第29位
    for(int i=1,cnt=1; i<=(1<<29); i<<=1,cnt++) {
        //如果第cnt位的space值不等于0,假设x为space[cnt],那么a[x]的第cnt位必定为0
        if(space[cnt]) {
            int tmp=0;
            //假设sapce[cnt]为x,那么j从x-1枚举到1
            //tmp初始为0,然后和b[1],b[2],...b[x-1]异或,即把b[1],b[2],...b[x-1]全部异或
            //tmp即为a[1]^a[x],a[x]的第cnt位必定为0,然后a[1]的第cnt位和0进行异或得到的仍是a[1]的第cnt位,然后i是第cnt位为1,其它位均为0的二进制数,然后
            //和i进行与运算,就仅仅保留a[1]的第cnt位,于是我们就确定了a[1]的第cnt位是多少
            for(int j=space[cnt]-1; j>0; j--) tmp^=b[j];
            tmp&=i;
            a[1]+=tmp;
        }
        //如果第cnt位的space值不等于0,说明第cnt位不能确定,那么就自己填充,确定的位我们已经改变不了了,然后未确定的位我们可以选择填充0还是1
        //那么具体如何填充呢?因为我们要使得字典序是第k小的,所以我们未确定的位就和k(已经减过1了)的二进制对照,从最低位开始,第i次使用k(已经减过1了)的第i低的位进行填充
        //pos表示二进制,pos不断左移,从1到10到100到1000...
        else {
            if(pos>k) continue;//如果已经填充为第k小的了,那么就不用继续填充了,前面补前导0就行了,而每一位本身就是0,所以根本无需操作,直接continue
            if(k&pos) a[1]+=i;//如果k的这一位为1,那么就将a[1]的这一位改为1
            pos<<=1;//pos左移一位
        }
    }
    //pos由于最后多移动了一位,所以我们填充的其实少一位,这也就是为什么要取等号的原因,所以当pos小于等于k时,说明没有填充到第k小,输出-1
    if(pos<=k) {
        cout<<-1<<endl;
        return;
    }
    //我们已经确定出了a[1],现在我们只要根据a[1]来确定出整个a数组,然后验证其合法性即可
    for(int i=2; i<=n; i++) {
        a[i]=a[i-1]^b[i-1];//a[i]^a[i+1]=b[i],两边同时异或一个a[i],得a[i+1]=a[i]^b[i]
        if(a[i]<a[i-1]) {
            cout<<-1<<endl;
            return;
        }
    }
    for(int i=1; i<=n; i++) cout<<a[i]<<" ";
    cout<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)
        solve();
    return 0;
}

I.We love Strings

k>>1相当于k/2

k>>=1相当于k/=2

按字符串长度进行分类

当字符串长度小于等于20时,直接暴力枚举所有可能的字符串,放入set中,由于set会自动去重,所以只要返回set中的元素个数就行了

当字符串长度大于20时,对于长度为i的所有字符串,枚举所有选与不选这些字符串的二进制串,根据容斥原理算满足的个数(具体解释见注释)

证明见2023牛客暑假多校 C I M 题解 | JorbanS_JorbanS的博客-CSDN博客

容斥原理:

 

 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=410,mod=998244353;
vector<string>s[N];
set<string>st;
string tmp;
int n;
void dfs(string s,int len,int cur) {
    //s为当前已经生成的字符串
    //cur表示当前填了几个了
    if(s.size()==len) {
        st.insert(s);
        return;
    }
    //tmp是题目所给的字符串,s是我们自己构造的字符串,当前字符为?时,改成0或1,当前字符本来就为0或1时,那么直接就是原来的字符
    if(tmp[cur]=='?') {
        dfs(s+'1',len,cur+1);//始终搜长度为len的字符串
        dfs(s+'0',len,cur+1);
    } else {
        dfs(s+tmp[cur],len,cur+1);
    }
}
void solve() {
    cin>>n;
    for(int i=1; i<=n; i++) {
        string ss;
        cin>>ss;
        int sz=ss.size();//字符串的长度
        s[sz].push_back(ss);//长度相同的字符串都放在一个容器里
    }
    int ans=0;
    //枚举字符串的长度
    for(int i=1; i<=400; i++) {
        if(!s[i].size()) continue;//如果没有长度为i的字符串,那么就continue
        //如果字符串长度小于等于20
        if(i<=20) {
            for(auto ss:s[i]) {
                tmp=ss;
                dfs("",i,0);//从空字符串开始搜,搜所有长度为i的字符串
            }
        }
        //如果字符串长度大于20
        else {
            int num=s[i].size();//长度为i的字符串有几个
            int m=1<<num;//m为2^num
            //枚举j从1到2^num-1,2^num-1为非空子集的个数(子集的个数为2^num,然后去掉空集,也就是说我们至少选择一个字符串)
            //可以用0表示不选该字符串,用1表示选该字符串,然后所有num个字符串的选与不选用二进制串表示,然后去掉全是0的二进制串
            //枚举所有长度为i的字符串的所有组合状态,每个字符串的选与不选
            for(int j=1; j<m; j++) {
                int cnt=0;//记录当前处理的字符串个数
                bool ok=true;//标记该二进制串是否符合条件
                string tmps;
                for(int k=0; k<i; k++) tmps+='?'; //临时字符串tmps(长度为i)初始化为i个'?',看tmps能否变成一个串满足我们所选的所有字符串,计入个数cnt,如果cnt为奇数,说明奇数个字符串可以表示成一样的,也就是说
                //奇数个集合相交的排列组合的方式是一样的,根据容斥原理,加上奇数个相交的部分,减去偶数个相交的部分
                //遍历长度为i的字符串数组s[i]中的每一个字符串s[i][t]
                for(int t=0; t<num; t++) {
                    //判断当前字符串是否被选,j是一个二进制串,然后取每一位看是否为1,即看该字符串是否被选,该位为1则表示该字符串被选
                    if(j>>t&1) {
                        cnt++;
                        //遍历长度为i的字符串s[i][t]中的每一个字符s[i][t][tt]
                        for(int tt=0; tt<i; tt++) {
                            //判断当前位置是否为问号,如果为问号,则更新为s[i][t][tt]的值
                            if(tmps[tt]=='?') {
                                if(s[i][t][tt]!='?') tmps[tt]=s[i][t][tt];
                            //如果当前位置不是问号并且不相等,则标记为不满足条件
                            } else if(s[i][t][tt]!=tmps[tt]) {
                                ok=false;
                                break;
                            }
                        }
                    }
                }
                if(!ok) continue;
                int mi=1;
                for(int k=0;k<i;k++){
                    if(tmps[k]=='?') mi=mi*2%mod;//最后如果能将选中的字符串表示成一样的,那么该种字符串的排列组合即为2^x(x为问号的个数)
                }
                //容斥原理
                if(cnt&1) ans=(ans+mi)%mod;
                else ans=(ans-mi+mod)%mod;
            }
        }
    }
    ans=(ans+st.size())%mod;
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
        solve();
    return 0;
}

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

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

相关文章

爬虫017_urllib库_get请求的quote方法_urlencode方法_---python工作笔记036

按行来看get请求方式 比如这个地址 上面这个地址复制粘贴过来以后 可以看到周杰伦变成了一堆的Unicode编码了 所以这个时候我们看,我们说https这里,用了UA反爬,所以这里 我们构建一个自定义的Request对象,里面要包含Us

博客项目(Spring Boot)

1.需求分析 注册功能&#xff08;添加用户操纵&#xff09;登录功能&#xff08;查询操作)我的文章列表页&#xff08;查询我的文章|文章修改|文章详情|文章删除&#xff09;博客编辑页&#xff08;添加文章操作&#xff09;所有人博客列表&#xff08;带分页功能&#xff09;…

Claude 2、ChatGPT、Google Bard优劣势比较

​Claude 2&#xff1a; 优势&#xff1a;Claude 2能够一次性处理多达10万个tokens&#xff08;约7.5万个单词&#xff09;。 tokens数量反映了模型可以处理的文本长度和上下文数量。tokens越多&#xff0c;模型理解语义的能力就越强&#xff09;。它在法律、数学和编码等多个…

【EI/SCOPUS检索】第三届新媒体发展与现代化教育国际学术会议(NMDME 2023)

第三届新媒体发展与现代化教育国际学术会议&#xff08;NMDME 2023&#xff09; The 3rd International Conference on New Media Development and Modernized Education 第三届新媒体发展与现代化教育国际学术会议(NMDME 2023)将于2023年10月13-15日于西安召开。会议旨在为新…

【实测有效】朋友圈截图生成,制作朋友圈网页教程

使用教程可以自己看工具的使用手册。 Windows电脑版&#xff1a; https://imageio.jscs.top/zip/wxchat-moment-windows Mac电脑版&#xff1a; https://imageio.jscs.top/zip/wxchat-moment-mac 比如&#xff0c;你可以使用朋友圈评论生成器制作一段搞笑的评论回复&#…

【雕爷学编程】Arduino动手做(01)---干簧管传感器模块3

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Winrar右键没有压缩选项,怎么找回?

我们安装了WinRAR之后想要压缩文件&#xff0c;但是右键点击文件之后发现并没有WinRAR压缩选项&#xff0c;这应该如何设置才能出现右键带有压缩选项呢&#xff1f;方法如下&#xff1a; 首先打开WinRAR&#xff0c;在上面功能中点击选项 – 设置 然后我们在设置界面中切换到集…

openLayers实战(四):设置地图中心点、修改地图中心点

截至到目前阶段的功能&#xff0c;我自己实现最完整的代码 import "ol/ol.css"; import Map from "ol/Map"; import Feature from "ol/Feature"; import VectorSource from "ol/source/Vector"; import Overlay from "ol/Overlay…

2.4g无线芯片G350规格书详细介绍

G350是一款高度集成的2.4GHz无线收发芯片&#xff0c;旨在为各种应用提供低成本、高性能的无线通信解决方案。该芯片通过降低功耗&#xff0c;在保持寄存器值条件下&#xff0c;实现最低电流为5μA&#xff0c;从而显著提高了电池寿命。它内置了发射接收FIFO寄存器&#xff0c;…

【vue+el-table+el-backtop】表格结合返回顶部使用,loading局部加载

效果图: 一. 表格结合返回顶部 二. 局部loading 解决方法: 一 返回顶部 target绑定滚动dom的父元素类名就可以了. 1.如果你的表格是 固定表头 的,那滚动dom的父元素类名就是 el-table__body-wrapper <el-backtop target".el-table__body-wrapper" :visibility…

python练手项目百度网盘,python练手经典100例项目

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python练手项目 源代码 百度网盘&#xff0c;python练手项目码源百度网盘&#xff0c;现在让我们一起来看看吧&#xff01; 前言 Python 是一种面向对象、解释型、弱类型的脚本语言&#xff0c;它也是一种功能强大而完善…

班级事务管理系统设计与实现

班级事务管理系统 后端采用Spring Boot开发。 cloud分支版本正在开发中&#xff0c;后端采用Spring Cloud进行改造。 系统架构 项目采用B/S架构&#xff0c;前后端通讯采用RESTful API&#xff0c;数据格式使用Json&#xff0c;认证Token格式采用JWT。 身份认证使用Spring …

第五章 Opencv图像处理框架实战 5-8直方图与傅里叶变化

1、直方图定义 import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 直方图 cv2.calcHist(images,channels,mask…

【音视频、chatGpt】h5页面最小化后,再激活后视频停住问题的解决

目录 现象 观察 解决 现象 页面有时候要切换&#xff0c;要最小化&#xff1b;短时间或者几个小时内切换回来&#xff0c;视频可以正常续上&#xff1b;而放置较长时间&#xff0c;几个小时或者一晚上&#xff0c;切换回来后&#xff0c;视频可能卡死 观察 切换页面&#x…

如何给Linux开启swap虚拟内存

查看系统内存资源 free -h 创建swap分区 dd if/dev/zero of/swapfile bs1024 count4194304dev/zero&#xff1a;是Linux的一种特殊字符设备(输入设备)&#xff0c;可以用来创建一个指定长度用于初始化的空文件&#xff0c;如临时交换文件&#xff0c;该设备无穷尽地提供0&…

工程监测仪器振弦传感器信号转换器应用于隧洞监测

工程监测仪器振弦传感器信号转换器应用于隧洞监测 隧洞建设是重大工程项目&#xff0c;监测隧洞结构和环境的变化对确保隧洞安全和运行管理至关重要。工程监测仪器是实现隧洞监测的关键设备&#xff0c;其中振弦传感器和信号转换器是非常重要的组成部分。 振弦传感器是一种专门…

AI自动驾驶

AI自动驾驶 一、自动驾驶的原理二、自动驾驶的分类三、自动驾驶的挑战四、自动驾驶的前景五、关键技术六、自动驾驶的安全问题七、AI数据与自动驾驶八、自动驾驶的AI算法总结 自动驾驶技术是近年来备受关注的热门话题。它代表了人工智能和机器学习在汽车行业的重要应用。本文将…

SAP Range 表

Range表装的一些个复杂的可以选择的值。有时候单选的值不够用的&#xff0c;用Range表。 数据结构就是Select option一样的。当你在选择屏幕定义一个selection-option的时候&#xff0c;系统自动定义个range表。那我们自己想定义个来用用咋搞&#xff1f; Range表有四列&…

在rviz中实时显示车辆轨迹

在工作空间中创建包 cd ~/catkin_ws/src catkin_create_pkg trajectory_display_example roscpp nav_msgs sensor_msgs在src文件夹下创建一个C源文件 #include <ros/ros.h> #include <nav_msgs/Odometry.h> #include <nav_msgs/Path.h> #include <senso…

roi感兴趣区域像素值统计,求roi感兴趣区域内像素值的最小值、最大值、均值、标准差(标准方差)

文章目录 1、求roi感兴趣区域内像素值的最小值、最大值minMaxLoc() 函数原型&#xff1a;&#xff08;1&#xff09;原型一&#xff1a;&#xff08;2&#xff09;原型二&#xff1a;&#xff08;3&#xff09;另外与 minMaxLoc()函数原型一&#xff0c;用法相同的函数 minMaxI…