首页 > 其他分享 >CF424C的题解

CF424C的题解

时间:2023-10-19 11:04:22浏览次数:43  
标签:pre ... 题解 bmod large CF424C oplus aligned

简单题。CF 评分才 *1600。

可以直接先把 \(Q\) 拆成两部分。

\[\begin{aligned} \large a&=\oplus^n_{i=1}p_i\\ \large b&=\oplus^n_{i=1}\oplus^n_{j=1}\ \ \ (i\bmod j)\\ \large Q&=a\oplus b \end{aligned} \]

\(a\) 很好算,我们看一下 \(b\) 具体要怎么算。

把 \(b\) 所有项写出来:

\[\begin{aligned} b=&(1\bmod 1)\oplus(1\bmod 2)\oplus...(1\bmod n)\oplus\\ &(2\bmod 1)\oplus(2\bmod 2)\oplus...(2\bmod n)\oplus\\ &...\\ &(n\bmod 1)\oplus(n\bmod 2)\oplus...(n\bmod n)\\ =&(1\bmod 1)\oplus(2\bmod 1)\oplus...(n\bmod 1)\oplus\\ &(1\bmod 2)\oplus(2\bmod 2)\oplus...(n\bmod 2)\oplus\\ &...\\ &(1\bmod n)\oplus(2\bmod n)\oplus...(n\bmod n)\\ \end{aligned} \]

发现 \(i\) 和 \(j\) 的位置互换并不会有什么影响。

所以我们有:

\[\large b=\oplus^n_{i=1}\oplus^n_{j=1}\ \ \ (i\bmod j)=\oplus^n_{i=1}\oplus^n_{j=1}\ \ \ (j\bmod i) \]

记 \(\large pre_i=\oplus^i_{s=1}s\),根据异或的性质,我们有 \(a\oplus a=0\)。

那么

\[\oplus^n_{j=1}\ \ \ (j\bmod i)= \left\{ \begin{aligned} pre_{n\bmod i}\ \ \ \ \ \ \ \lfloor \frac{n}{i}\rfloor\bmod 2=0\\ pre_{n\bmod i}\oplus pre_i\ \ \ \ \ \ \ \lfloor \frac{n}{i}\rfloor\mod2=1 \end{aligned} \right. \]

\[\begin{aligned} \large b&=\oplus^n_{i=1}\oplus^n_{j=1}\ \ \ (j\bmod i)\\ \large &=pre_{n\bmod i}\oplus^n_{i=1\&\lfloor \frac{n}{i}\rfloor\bmod 2=1}\ pre_i \end{aligned} \]

那么代码就很好写了。

#include<cstdio>
#define ll long long
const int N=1e6+10;
int n;
ll pre[N],ans;
ll p;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&p),ans^=p,pre[i]=pre[i-1]^i;
	for(int i=1;i<=n;i++)
	{
		if((n/i)&1) ans^=pre[i-1];
		ans^=pre[n%i];
	}
	printf("%lld",ans);
	return 0;
}

时间复杂度 \(O(n)\)。

标签:pre,...,题解,bmod,large,CF424C,oplus,aligned
From: https://www.cnblogs.com/osfly/p/17774224.html

相关文章

  • CF580B的题解
    见到有单调性、有限制的区间问题,很自然地就会想到用尺取去做。先按工资升序排序,然后套上尺取就行了。不会尺取的可以根据这道题去学。时间复杂度\(O(n\logn)\)。#include<cstdio>#include<algorithm>#definelllonglongusingnamespacestd;constintN=1e5+10;intn......
  • ARC166B题解
    发现还没有和我一样的做法。觉得B比A好想的多。令\(A_i\)为\(a_i\)变成\(A\)的倍数最少次数,\(B_i,C_i,AB_i,AC_i,BC_i,ABC_i\)同理。那么我们就有\(A_i=(A-A\bmod{a_i})\bmodA\),其他同理。这一大坨东西显然都能在\(O(n)\)的时间复杂度内算出来。剩下的就很好......
  • [题解]CF1881G Anya and the Mysterious String
    思路发现如果一个字符串中有长度大于等于\(2\)回文子串,必定有长度为\(2\)的回文子串或长度为\(3\)的回文子串,并且形如:aa和aba。所以考虑用线段树这两种情况。维护一段区间的最左、次左、最右、次右的元素,同时用两个标记变量\(f_1,f_2\)分别表示这个区间中是否出现形如......
  • [AGC020F] Arcs on a Circle 题解
    ArcsonaCircle首先,一个非常自然的想法是尝试断环成链。怎么断呢?我们发现,选择最长线段的起点处截断是个非常好的选择,因为不可能有一个线段完全覆盖它。这之后,一个紧接着的想法就是DP。假如把描述中的全部“实点”改成“整点”的话,那么这题是比较trivial的,可以通过随便状压......
  • 洛谷 P4749 [CERC2017] Kitchen Knobs 题解
    KitchenKnobs首先,一个trivial的想法是,因为每个旋钮如果上面的数字并非全部相同则其必有唯一最优位置,故直接扔掉那些全部相同的旋钮,对于剩余的求出其最优位置。明显此位置是一\(0\sim6\)的数。因为是区间同时旋转,所以转成数之后就是区间加同一个数。一个经典套路是差分。这......
  • [ABC207F] Tree Patrolling 题解
    [ABC207F]TreePatrolling弱智DP题,设\(f(i,j,0/1/2)\)表示在点\(i\),子树中有\(j\)个点被覆盖,且\(i\)点自身状态是未被覆盖/被自身覆盖/被某个儿子覆盖,然后树上背包更新就行了。代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmo......
  • CF1542E2 Abnormal Permutation Pairs (hard version) 题解
    AbnormalPermutationPairs(hardversion)两个限制:字典序小、逆序对大,一个显然的想法就是确保一对关系,统计另一对关系。确保哪一对呢?我们想了想,决定确保字典序小,因为字典序是可以贪心的。具体而言,我们考虑两个排列自第\(i\)位开始出现了不同。这样子,我们便将两个排列各自划......
  • AT_tdpc_tree 木 题解
    木弱智DP题,直接设\(f_i\)表示\(i\)子树内染色的方案数,然后每次合并一个点与它的儿子即可(具体而言,因为儿子间独立,所以方案数就是二项式系数)。需要注意的是因为第一条边可以在任意位置,所以要以每个点为根各DP一次。但是这样每条边会被算两次,所以乘以2的逆元即可。时间......
  • [ARC072E] Alice in linear land 题解
    [ARC072E]Aliceinlinearland首先,一个trivial的想法是记\(f_i\)表示第\(i\)步前离终点的距离,于是\(f_i=\min\Big(f_{j-1},|f_{j-1}-d_i|\Big)\)。然后,我们设\(f_i'\)表示在修改第\(i\)步后,此时离终点的距离。明显,\(f_i'\)可以为任意不大于\(f_i\)的值,因为此时......
  • CF568E Longest Increasing Subsequence 题解
    LongestIncreasingSubsequenceLIS问题有两种主流\(O(n\logn)\)解法,最常见的树状数组法,以及不那么常见的二分法。然后考虑本题,发现一个神奇的思路就是求出LIS后倒序复原出数组。进一步思考后发现,因为本题是LIS(LongestIncreasingSubsequence)而非LNDS(LongestNon-Decr......