360公司-2019笔试题目

众所周知,集合{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

输出描述:

输出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;

 公式:\mathbf{factor=A{n}^{n}\ast \left ( n-1 \right )\div C{n}^{2}= \left ( n-1 \right )!\ast 2}

 代码编写:因为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;
    }
}

 

你可能感兴趣的:(Java学习)