码迷,mamicode.com
首页 > 其他好文 > 详细

Easy Construction

时间:2020-07-28 00:18:40      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:区间   选择   tip   ubi   The   要求   code   bin   构造   

题目描述

Roundgod is given n,k,construct a permutation P of 1~n satisfying that for all integers i in [1,n],there exists a contiguous subarray in P of length i whose sum is k modulo n. If there are multiple solutions,print any of them. If there is no solution ,print "-1" in one line.

输入描述

The first line contains two integers n,k(1\(\leq\) n\(\leq\) 5000,\(0\leq k \leq n\) )

输出描述

Print N integers, the answer permutation in one line if such permutation exists. or print "-1" in one line if no solution exists.

示例1

输出

2 1

输出

1 2

说明

The sum of subintervals [1],[1,2] both satisfy \(\equiv\) 1(mod 2),and their lengths are 1,2 respectively.

题解

首先理解题意,给定n,k我们需要构造一个1~n的排列P,使得对于1-n 中任意的数i,P都存在一个长为i的子区间的和模n余k,有解输出任意一组,无解输出-1.

首先如果要有解,k必须是n(n+1)/2%n,因为当i取n的时候,我们需要有一个长为n的子区间来满足它的和模n余k,而整个排列P中,长为n的子区间只有一个,那就是整个排列P,这样的话,这个区间的和就可以算出来,是n(n+1)/2,这个和模n最后得k。所以k就等于n(n+1)/2%n。如果k不满足这个,那么就无解,应该输出-1.

然后观察这个式子n(n+1)/2%n,既然要求模,就一定要有除法,那么n(n+1)/2/n的结果的余数就是我们求的模,这个结果是(n+1)/2,如果n为奇数,n+1为偶数,能够整除2,也就是说,n(n+1)/2/n能整除,那么余数就是0,所以当n为奇数时,k就是0.

当n为偶数时,n+1是奇数,奇数除以2不能整除,这时候就有余数了,那么余数怎么算?我们可以对应3/2=1.5,来计算余数,1.5是个小数,我们就让它向下取整,得到1,然后1再乘以除数,得到2,最后用被除数来减掉2,就是余数1. 此时我们的余数是\(\frac{n+1}{2}\) ,我们进行下列演化:

\[\frac{n+1}{2}=\frac{n+1-1+1}{2}=\frac{n}{2}+\frac{1}{2} \]

因为n+1是奇数所以除以2才会不整除,所以我们先把n+1减去1,这样就变成了偶数,就可以整除2了,为保证正确我们在后面还要加上\(\frac{1}{2}\) ,最后我们得到\(\frac{n}{2}+\frac{1}{2}\) ,\(\frac{n}{2}\) 就是这个商的整数部分,我们用它乘上除数n,得到\(\frac{n^{2}}{2}\) ,用被除数减去它,即$$\frac{n(n+1)}{2}-\frac{n^{2}}{2}=\frac{n}{2}$$ ,所以余数就是\(\frac{n}{2}\) ,所以此时k就是\(\frac{n}{2}\) .

综上,当n为奇数时,k=0,当n为偶数时,k=n/2。下面来分别讨论。

当n为奇数时,也就是k=0的时候,我们需要让整个排列P中能挑出任意长度的连续区间,这个区间的和模n余k。这里k是0,那么也就是说,区间的和是n的倍数。所以我们只要凑n就行了,大概的排列如下

P={n,1,n-1,2,n-2,...}

当区间长度为1的时候,选择{n},这时区间和模n等于0,当区间长度为2的时候,选择{1,n-1},这时区间和模n等于0,当区间长度为3的时候,选择{n,1,n-1},此时的区间和仍然模n等于0.大概就照这样的套路找下去,一定能找到解。

当n为偶数时,也就是k=\(\frac{n}{2}\) 时,我们需要让整个排列P中能挑出任意长度的连续区间,这个区间的和模n余k。这里k是\(\frac{n}{2}\) ,也就是说这个区间和是\(\frac{n}{2}\) 的倍数,但不是n的倍数,同时也需要凑n,基于这个特点,大概可以构造出以下的排列:

P={n,n/2,1,n-1,2,n-2}

当区间长度为1的时候,选择{n/2},这时区间和模n等于n/2,当区间长度为2的时候,选择{n,n/2},因为加了一个n后再模n,对结果没有影响,所以模n还是等于n/2,照这样,每次就加一个n,这个n可以由排列中的数凑出来,当区间长度为3的时候,选择{n/2,1,n-1}

区间和是模n等于n/2的,就照这个套路,构造下去。

Easy Construction

标签:区间   选择   tip   ubi   The   要求   code   bin   构造   

原文地址:https://www.cnblogs.com/fate-/p/13387903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!