P1000 逆序对

题目背景

出题人 @GeorgeDeng。

请注意这道题不同寻常的空间限制。

这道题轻微卡常(好像不是轻微)。

如果认为自己时间复杂度正确,请加上快读:

__always_inline long long read(){
    long long x = 0,f = 1;
    char ch = getchar();
    while(ch<'0'&&ch>'9'){
        if(ch=='-') f = 0-f;
        ch = getchar();
    }
    while(ch>='0'&&ch<='9'){
        x = x*10+(ch-'0');
        ch = getchar();
    }
    return x*f;
}

函数的返回值为第一个读到的整数。

如果还是过不了,请在除了主函数外的所有函数前面加上 __always_inline 修饰。

请务必保证你的时间复杂度为 \(O(n \log n)\)。

题目描述

定义两个整数 \(a\) 和 \(b\) 为逆序对个数如下:

  • 如果 \(a\) 的一个质因数比 \(b\) 中一个质因数大的对数,则称 \(a\) 和 \(b\) 组成逆序对个数,记为 \(n(a,b)\)。
  • 例如:\(8\) 和 \(14\)。因为 \(8=2^3,14=2\times7\),\(8\) 的质因数只有 \(2\),\(14\) 的质因数有 \(2\) 和 \(14\)。\(8\) 的质因数中没有比 \(14\) 的质因数大的,所以我们称 \(8\) 和 \(14\) 形成了 \(0\) 个逆序对,\(n(8,14)=0\)。
  • 反过来,\(14\) 的质因数有 \(1\) 个比 \(8\) 大的(\(7\) 和 \(2\)),所以我们称 \(14\) 和 \(8\) 形成了 \(1\) 个逆序对,\(n(14,8)=1\)。

现在有一个长度为 \(n\) 的数组 \(A\),请求出 \(A\) 里的逆序对个数,即 \(\sum n(A_i,A_j)\) \((i<j)\)。

输入格式

本题包含多组测试数据。

输入文件的第一行一个正整数 \(T\),表示测试数据的组数。

对于每组测试数据,第一行是一个整数 \(n\),表示数组长度,第二行 \(n\) 歌整数 \(A_i\),表示数组。

输出格式

对于每一组测试数据,输出它的逆序对个数 \(\sum n(A_i,A_j)\) \((i<j)\)。

输入输出样例 #1

输入 #1

2
2
8 14
2
14 8

输出 #1

0
1

说明/提示

数据范围与约定

对于 \(20\%\) 的数据,\(1\le n \le 100\)。

对于 \(50\%\) 的数据,\(1\le n \le 10^4\)。

对于 \(100\%\) 的数据,\(1\le T \le 3,1\le n \le 3\times 10^5,1\le A_i \le 3\times 10^5\),保证运算中所有数均在 \(64\) 位有符号整数的表示范围内。