思路:

题目晦涩难懂,此题的难点在于看懂出题人想要表述的内容。

作者真正想要表述的意思为:

长度为n的数组p,需从数组中取q轮数据x和y。每轮(轮次以i计,i在1和q-1之间)取数,x的取值范围为数组p的下标在l1[i]~r1[i]之间的元素值,y的取值范围为数组p的下标在l2[i]~r2[i]之间的元素值。满足min(x,y)==gcd(x,y)时,此轮数据的有效答案数+1。返回各轮次有效答案数的数组。

如下图所示:

import java.util.*; public class Solution {     /**      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可      *      *       * @param n int整型 n      * @param q int整型 q      * @param p int整型一维数组 p      * @param l1 int整型一维数组 l1      * @param r1 int整型一维数组 r1      * @param l2 int整型一维数组 l2      * @param r2 int整型一维数组 r2      * @return int整型一维数组      */ public int[] PermutationQuery(int n, int q, int[] p, int[] l1, int[] r1, int[] l2, int[] r2) {

int[] ans_nums = new int[q];

        for (int i = 0; i < q; i++) {//每轮次询问,共q轮

            for (int j = l1[i]; j <= r1[i]; j++) {//x的下标范围

                int x = p[j];

                for (int k = l2[i]; k <= r2[i]; k++) {//y的下标范围

                    int y = p[k];

                    if (x % y == 0 || y % x == 0) {

                        if(x!=y){//x、y相等时不计最大公约数

                            ans_nums[i]++;

                        }

                       //System.out.println(i+"   "+j+"   "+k+"   "+x+"     "+y);

                    }

                }

            }

        }

        

        return ans_nums;

} }