等差数列问题
模意义下的等差数列
题目1:给定素数m,并给定n个不同的数a1,…,an,满足0≤ai<m。现在我们希望将整个数组进行排列,得到新的数列b1,…,bn,满足对所有的1<i<n,有bi−bi−1=bi+1−bi。如果存在这样的一个排列,就输出任意一个,否则报告无解。
这是一道CF原题。
如果n≤1,答案很显然,因此我们仅考虑2≤n的情况。
设我们找到的等差数列的公式为f(i)=x+id,其中bi=f(i−1)。可以发现一定有d>0,考虑到m是素数,因此m和d一定互质,即我们保证了f(0),f(1),…,f(m−1)都是不同的数。
若n≤m2满足,则考虑a1,a2,设二者分别对应b的第i和i+k项,则一定有a2−a1=kd。注意到b1,…,bn对应的是f(0),…,f(n−1),其中正好有n−k项的差值正好为kd,因此我们可以通过哈希表枚举有多少数对的差值正好为kd,从而计算出k,进而得出d。
知道了k,下面考虑怎么算x。由于
n−1∑i=0ai=n−1∑i=0x+id=nx+n(n−1)d2通过上面的公式,我们可以直接求出x。接下来我们验证一下解是否可行即可。总的时间复杂度为O(n)。
下面考虑当n≥m2的时候,我们可以考虑a中元素的补集¯a即可,可以发现其对应的等差数列为f(n),f(n+1),…,f(m−1)。求出¯a对应的等差数列,之后递推前面几项即可,时间复杂度相同。
题目1:给定任意数m,并给定n个不同的数a1,…,an,满足0≤ai<m。现在我们希望将整个数组进行排列,得到新的数列b1,…,bn,满足对所有的1<i<n,有bi−bi−1=bi+1−bi。如果存在这样的一个排列,就输出任意一个,否则报告无解。
一道原题。
不会。