• Easy Construction


    题目描述

    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,(0leq 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的,就照这个套路,构造下去。

  • 相关阅读:
    T4设计时模板调试
    MVC开发T4代码生成之一文本模板基础
    经典选项卡
    IE 调试工具 Utilu IE Collection:IE5.5、6.0、7.0, 8.0…各版本浏览器兼容性测试工具
    滚动读行!
    自定义标签的用法、支持IE6
    jQuery 参数传递例子
    IMG在IE6下不能HOVER的解决办法!
    点击渐变弹出层
    操作滚动条滚动到指定位置
  • 原文地址:https://www.cnblogs.com/fate-/p/13387903.html
Copyright © 2020-2023  润新知