首页 > 其他分享 >20241021 校测T1 致敬传奇捆绑测试题目(Perm) 题解

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

时间:2024-10-22 17:21:04浏览次数:7  
标签:... le 10 题解 校测 Perm 异或 ans sim

题解:致敬传奇捆绑测试题目 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());
} 

标签:...,le,10,题解,校测,Perm,异或,ans,sim
From: https://www.cnblogs.com/Ydoc770/p/18493354

相关文章

  • [ARC133E] Cyclic Medians 题解
    一点不会套路。思路对于中位数相关,发现我们不好直接表示与中位数有关的内容。不妨枚举\(x\),把大于\(x\)的标为\(1\),小于等于\(x\)的标为\(0\),这样把所有最终为一的方案数加起来就是原来的答案。大概是这样一个东西:\[k=\sum_{i=0}^k[i<k]\]这个怎么求呢。发现若一组......
  • Public NOIP Round #7 T3 黑白棋子 题解
    Description有一棵\(n\)个点的树,顶点的编号为\(1\)到\(n\)。对于树中的每个顶点,可能存在一个白色的棋子、一个黑色的棋子,或者没有棋子。树上正好有\(w\)个白色棋子和\(b\)个黑色棋子。另外,对于每一对具有相同颜色棋子的顶点,存在一条路径,路径上的每个顶点都包含相同颜色......
  • AT_agc064_c [AGC064C] Erase and Divide Game 题解
    先考虑所有\(l_i=r_i\)时怎么做,可以建出反向Trie树,问题转化为从根开始每次向左子树或右子树走,第一个拿到空子树的人输,直接在Trie上dp即可。考虑从叶子层开始对每一层的点合并两个子树的dp值,发现每一层值相同的连续段是较少的。于是可以维护这些连续段,每次合并要将每个......
  • 洛谷P2596 [ZJOI2006] 书架 题解 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P2596主要涉及的操作就是:找到某一个编号的点(这个操作可以不用splaytree维护)删除某个点将某一个点插入到最前面,最后面,或者某一个位置查询前序遍历为\(k\)的节点编号因为每次删除都会又把这个点加回去,所以可以复用\(n\)个......
  • [题解]CF825E Minimal Labels
    LPhang为什么是神?思路显然可以想到一个错误的贪心:直接拓扑排序,每一次选择当前可以拓展的点中最小的元素进行编号。由于可能存在一个值较小的元素被藏在一个较大的元素后面,这种贪心就会出问题。出问题的本质原因就是我们希望字典序最小,就得使得越小的位置分配到更小的值。不妨......
  • 历年CSP-J初赛真题解析 | 2017年CSP-J初赛完善程序(27-36)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客(快速幂)请完善下面的程序,该程序使用分治法求x......
  • CF2023D Many Games 题解
    赛时被创四了。思路考虑我们什么时候合并会比原来优。例如,我们现在要合并\(p_1,w_1\)和\(p_2,w_2\),同时保证,\(w_1\gew_2\)。那么有:\[\frac{p_1}{100}\timesw_1\le\frac{p_1}{100}\times\frac{p_2}{100}\times(w_1+w_2)\]\[\frac{p_2}{100}\timesw_2\le\frac{p_1}{......
  • HyperMesh打开保存文件与面板功能使用
    打开和保存文件在HyperMesh中,打开和保存文件是最常用的命令。本节介绍HyperMesh打开和保存文件的多种方式。后续的练习中假定用户已经熟练使用HyperMesh进行文件打开和保存操作。本节将学习:  -打开HyperMesh文件。-在当前HyperMesh窗口中导入文件。-保存Hyper......
  • 01 Eclipse使用Maven慢的问题解决
    1.Eclipse使用的是内置的MavenEclipse有可能使用了内置的Maven,而不是独立安装的Maven。如果使用Eclipse内置的Maven,默认的settings.xml可能并未生成。你可以按以下步骤检查或修改Maven设置路径:a.检查Eclipse使用的Maven配置点击Window->Preferences在......
  • 【题解】Solution Set - NOIP2024集训Day58 字符串
    【题解】SolutionSet-NOIP2024集训Day58字符串https://www.becoder.com.cn/contest/5658「CF1466G」SongoftheSirens考虑对于\(s_i\),算钦定必须覆盖到\(t_i\)的匹配个数\(f_i\)。注意到\(s\)每次长度都会\(\times~2\)左右,其长度在\(O(\log|w|)\)的时候就......