import java.util.*;


public class Solution {
   // 定义模数,用于防止结果溢出
    private static final int mod = 1000000007;

    /**
     * 使用归并排序计算逆序对数量
     *
     * @param nums  待排序数组
     * @param left  左边界索引
     * @param right 右边界索引
     * @return 逆序对数量
     */
    private static long mergeSort(int[] nums, int left, int right) {
        // 递归终止条件:当区间只有一个元素或为空时,返回0
        if (left >= right) {
            return 0;
        }

        // 计算中间位置,使用位运算防止溢出
        int mid = left + ((right - left) >> 1);
        // 分治计算左右区间,并立即取模
        long res = (mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right)) % mod;

        // 创建临时数组用于合并
        int[] temp = new int[right - left + 1];
        int i = left;      // 左区间指针
        int j = mid + 1;   // 右区间指针
        int k = 0;         // 临时数组指针

        // 合并两个有序区间
        while (i <= mid && j <= right) {
            // 严格判断nums[i] <= nums[j],仅大于时统计逆序对
            if (nums[i] <= nums[j]) {
                temp[k++] = nums[i++];
            } else {
                temp[k++] = nums[j++];
                // 累加后立即取模,防止溢出
                // 当nums[i] > nums[j]时,左区间从i到mid的所有元素都大于nums[j]
                res = (res + mid - i + 1) % mod;
            }
        }
        // 拷贝左区间剩余元素
        while (i <= mid) {
            temp[k++] = nums[i++];
        }
        // 拷贝右区间剩余元素
        while (j <= right) {
            temp[k++] = nums[j++];
        }
        // 覆盖回原数组
        for (k = 0, i = left; k < temp.length; k++, i++) {
            nums[i] = temp[k];
        }
        return res;
    }

    /**
     * 计算数组中的逆序对数量
     *
     * @param nums 输入的整数数组
     * @return 逆序对的数量,结果对1000000007取模
     */
    public int InversePairs(int[] nums) {
        // 如果数组为null或长度小于等于1,则逆序对数量为0
        if (nums == null || nums.length <= 1) {
            return 0;
        }
        // 调用归并排序算法计算逆序对数量,并对结果取模防止溢出
        return (int) (mergeSort(nums, 0, nums.length - 1) % mod);
    }

}