20241021 校测T1 致敬传奇捆绑测试题目(Perm) 题解

news/2024/10/22 17:30:22

题解:致敬传奇捆绑测试题目 Perm

来自不知道什么时候的回忆。给定正整数 \(n\) ,一个 \(1\sim n\) 的排列 \(p\) 是一个好排列,当且仅当使得对于任意 \(1\le k<n\) ,都有 \(\sum_{i=1}^k p_i > p_{k+1}\) 。现在请你求出字典序第 小的好排列 \(p\)\(1\le n\le 10^6\)\(1\le k\le 10^{18}\) 。可是你出这个题开 Subtask 放 corner 被喷爆了……

你突然惊醒,发现你不仅只会 \(k=1\) ,而且还需要搞一场联测的 T1。这次你决定不绑 Subtask,而是一次把所有问题问完。
\(a_{l,i}\) 为对于 \(n=l,k=1\) 的上述问题答案的第 \(i\) 个数字,请你求出 \(\oplus_{1\le j\le i\le n}(a_{i,j}+j)\) ,其中 \(\oplus\) 代表按位异或。

Input

一行一个正整数 \(n\)

Output

一行一个整数表示答案。

Note

对于 \(60\%\) 的数据,保证 \(n\le 10^6\)
对于所有数据,保证 \(1\le n\le 10^{18}\)

分析

\(O(n)\) 部分分做法

手动模拟 \(k=1\) 的排列 \(p\),发现:

\[n=1,p_1 = 1 \]

\[n=2,p_2 = 2,1 \]

\[n=3,p_3 = 3,1,2 \]

\[n=4,p_4 = 3,1,2,4 \]

\[n=5,p_5 = 3,1,2,4,5 \]

\[... \]

\[p_n = 3,1,2,4,5,...,n \]

\(p_3\) 之后每次只会在排列末尾新加入 \(n\) 以保证最小字典序。
排列 \(p\) 每一项加上 \(j\) 得到最后统计答案的排列 \(p'\) :

\[p'=4,3,5,8,10,...,2n \]

统计答案时从第一项到最后一项被异或的次数由 \(n\) 递减,根据异或的性质只有被异或奇数次的会统计到答案里,判一下奇偶性即可。时间复杂度 \(O(n)\) ,可以通过 \(60\%\) 数据 。

\(O(1)\) 做法

利用 \(O(n)\) 做法打表,得到:

\[n=1,ans = 2 \]

\[n=2\sim 9,ans = 2,0,10,10,6,4,22,22 \]

\[n=10\sim 17,ans =2,0,26,26,6,4,38,38 \]

\[n=18\sim 25,ans = 2,0,42,42,6,4,54,54 \]

\[... \]

发现除开 \(n=1\) 其后每 \(8\) 个数一组存在规律且满足一次函数关系。直接 \(O(1)\) 算就完了。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;inline ll read() {ll otto = 0;char a = getchar();while(!isdigit(a)) a = getchar();while(isdigit(a)) {otto = (otto << 1) + (otto << 3) + (a ^ 48);a = getchar();}return otto;
}void solve(ll n) {if(n == 1) {printf("2");}else {--n;int op = n % 8;if(op == 1) printf("2");if(op == 2) printf("0");if(op == 3) printf("%lld", 10 + 16 * (n / 8));if(op == 4) printf("%lld", 10 + 16 * (n / 8));if(op == 5) printf("6");if(op == 6) printf("4");if(op == 7) printf("%lld", 22 + 16 * (n / 8));if(op == 0) printf("%lld", 22 + 16 * (n / 8));}
}int main() {freopen("perm.in", "r", stdin);freopen("perm.out", "w", stdout);solve(read());
} 

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

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

相关文章

Go语言net/http包源码学习

0.前言 该笔记为笔者第一次学习go的net/http包源码的时候所记,也许写的并不是很精确,希望大家多多包涵,一起讨论学习。 该笔记很大程度的参考了网名为“小徐先生”的前辈所分享的博客,推荐大家可以先看一看它的博客来一起学习,我的只是照葫芦画瓢还有一些代码更新的讲解而…

linux之core文件调试

linux之core文件调试 前言 有时候程序会异常退出而不带任何日志,此时就可以使用 core 文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息 什么是core文件 通常在 Linux 下遇到程序异常退出或者中止,我们都会使用 core 文件进行分析,其中包含了程序运行时的内存…

物联网从层次结构上分为几层,各层的主要作用是什么

物联网的层次结构包括感知层、网络层和核心层,每个层次都扮演着不可或缺的角色。感知层负责数据采集,网络层实现数据传输,核心层则进行数据处理和决策。这种层次结构的设计使得物联网能够高效地运行,为人们的生活和工作带来了巨大的便利和效益。1. 感知层(Perception Laye…

移动开发(四):.NET MAUI中Android应用修改安装图标和启动页面

今天继续给大家分享.NET MAUI中开发的Android应用如何修改安装图标和启动页面,希望对大家使用Net开发安卓APP提供一些帮助! 一、更换APP应用图标 这里我们直接编辑项目文件 MyFirstMauiApp.csproj来修改APP应用图标 官方案例默认的组合图标,其中ForegroundFile表示前景图像(…

将NC栅格表示时间维度的数据提取出来的方法

本文介绍基于Python语言,逐一读取大量.nc格式的多时相栅格文件,导出其中所具有的全部时间信息的方法~本文介绍基于Python语言,逐一读取大量.nc格式的多时相栅格文件,导出其中所具有的全部时间信息的方法。.nc是NetCDF(Network Common Data Form)文件的扩展名,表示一种常…

哪种IDE能同时写java和前端代码

在选择IDE(集成开发环境)来同时编写Java和前端代码时,几个主要的选择包括IntelliJ IDEA、Eclipse、和Visual Studio Code。IntelliJ IDEA提供了强大的Java开发支持和广泛的前端开发插件,Eclipse以其插件生态系统著称,可以通过安装相应的插件支持Java和前端开发,而Visual …

2024.10.22总结

byd放三道黑是吧本文于 github 博客同步更新。 今天打两场 byd放三道黑是吧。 第一场: A: CF1261F 将区间拆分为 \([x2^{i},(x+1)2^{i})\) 的形式,发现两个区间中的数两两异或后形成的仍为一个区间,将 A,B 都拆分后区间两两异或会得到 \(O(n^2\log^2n)\) 个区间,取并即为答…

【FMC163】基于VITA57.1标准的双通道3GSPS AD采集、双通道12GSPS DA回放FMC子卡模块(100%国产化)

板卡概述 FMC163是一款基于VITA57.1标准的实现2路14-bit、3GSPS ADC采集功能、2路14-bit 12GSPS DA回放FMC子卡模块。该模块遵循VITA57.1标准,可直接与FPGA载卡配合使用,该板卡支持对6GHz的射频信号进行数字化采样以及信号生成,板内集成了高性能的时钟管理模块,具有极高的收…