众所周知,集合{1 2 3 … N}有N!种不同的排列,假设第i个排列为Pi且Pi,j是该排列的第j个数。将N个点放置在x轴上,第i个点的坐标为xi且所有点的坐标两两不同。对于每个排列(以Pi为例),可以将其视为对上述N个点的一种遍历顺序,即从第Pi,1个点出发,沿直线距离到达第Pi,2个点,再沿直线距离到达第Pi,3个点,以此类推,最后到达第Pi,N个点,将该路线的总长度定义为L(Pi),那么所有N!种路线的总长度之和是多少,即L(P1)+L(P2)+L(P3)+...+L(PN!)的结果是多少?
输入描述:
第一行包含一个整数N,1≤N≤105。
第二行包含N个空格隔开的整数x1到xN,0≤x1<x2<x3<...<xN≤109。
输出描述:
输出L(P1)+L(P2)+L(P3)+...+L(PN!)对109+7取模后的结果。
输入例子1:
3
0 1 3
输出例子1:
24
例子说明1:
P1={1 2 3},P2={1 3 2},P3={2 1 3},P4={2 3 1},P5={3 1 2},P6={3 2 1};
L(P1)=3,L(P2)=5,L(P3)=4,L(P4)=5,L(P5)=4,L(P6)=3。
通过率100%
- 考察知识点:推理能力
- 考察知识点:Java中的大型数据处理不当造成的溢出问题
解题思路:主要是列举几个例子ABC, 一共6种排列(ABC,ACB,BAC,BCA,CAB,CBA),最后计算的无非是(AB+BC+AC+CB+.......)=4*(AB+AC+BC), 继续推到ABCD一共24种排列, 发现结果是12*(AB+AC+AD+BC+BD+CD)。那么4和12这些factor怎么推的呢?当例子是ABC(共6种排列),这6种排列中,有多少短距离呢? 6*(3-1)共计12个类似AB,AC这类东西。最终归根结底是AB+AC+BC这3种,那么12/3=4, 即总的个数除以类别数就是前面的系数。再推一个ABCD,一共24中排列,一共有24*(4-1)=72 段短距离,一共有6个种类(AB+AC+AD+BC+BD+CD),那么系数就是72/6=12;
公式:
代码编写:因为ABCD位于同一直线,所以AB+AC+AD+BC+BD+CD=3AD+BC;即计算最外面两个点的距离,再计算次外面两个点的距离。还有就是求阶乘要用long
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long[] arr = new long[n];
for(int i = 0; i < n; ++i){
arr[i] = sc.nextInt();
}
long sum = 0;
for(int i = 0; i <= (n - 1)/2; ++i){
sum += (n-1-2*i)* (arr[i] - arr[n -1- i]);
}
sum = (Math.abs(sum)) % 1000000007;
sum = (sum << 1) % 1000000007;
sum = (sum * fact(n - 1)) % 1000000007;
System.out.println(sum);
}
public static long fact(long n){
long rst = 1;
for(int i = 1; i <= n; ++i){
rst = (i*rst) % 1000000007;
}
return rst;
}
}