# 题目描述
最大排列差
现在有一个长度为 n 的排列 1, 2, 3, ... n
,现在小满希望将这个排列重新排列,要求每个位置和原来的数字不同,且相同位置的差的绝对值的和最大
- 输入:一个整数n.
3 <= n <= 10^12
- 输出: 一个整数,答案对
100000007
取模
# 测试用例
用例1:
- 输入: 3
- 输出: 4
- 解释:
1, 2, 3
重新排列得到3, 1, 2
,差为4
用例2:
- 输入: 5
- 输出: 12
- 解释:
1, 2, 3, 4, 5
重新排列得到4, 5, 1, 2, 3
,差为12
# 思路
因为是12345
这种固定顺序,所以测几个用例发现,题目要求的最大值,排列顺序情况是一样的,和排列长度的奇偶有关系,同时发现得到的差的绝对值是有规律的
- 当排列长度为奇数时,得到的最优情况为
(n - 1)(n + 1) / 2
- 当排列长度为偶数时,得到的最优情况一定是
1, 1, 3, 3, 5, 5, 7, 7...
这样的结果, 也就是(n * n) / 2
# 代码实现
var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;
console.log("请输入n: ");
let n = BigInt(readline());
console.log("n: ", n);
function test(n) {
let sum = 0;
if (n % BigInt(2) === 0n) {
sum = ((n * n) / BigInt(2)) % BigInt(100000007);
} else {
sum = (((n - BigInt(1)) * (n + BigInt(1))) / BigInt(2)) % BigInt(100000007);
}
return sum;
}
console.log("结果为: ", Number(test(n)));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20