#lydlx03x0B14. 天码 Sky Code
天码 Sky Code
四元组最大公约数为1
题目描述
给定你一个由 个不同整数构成的整数序列,从这个整数序列中选出 个数,使得这 个数的唯一公约数为 。
求满足条件的四元组的个数。
输入格式
输入中包含多组测试用例。
每个测试用例占据两行:
- 第一行包含整数
- 第二行包含 个用空格隔开的整数(均不超过 ),表示完整的整数序列
输出格式
每个测试用例输出一个结果,每个结果占一行。
数据范围
输入样例
4
2 3 4 5
4
2 4 6 8
7
2 3 4 5 7 6 8
输出样例
1
0
34
样例解释
第一个测试用例:N=4,序列 [2, 3, 4, 5]
从4个数中选4个数只有1种选法:{2, 3, 4, 5}
计算这4个数的最大公约数:
满足条件,所以有1个四元组。
输出:1
第二个测试用例:N=4,序列 [2, 4, 6, 8]
从4个数中选4个数:{2, 4, 6, 8}
计算最大公约数:
不满足条件,所以有0个四元组。
输出:0
第三个测试用例:N=7,序列 [2, 3, 4, 5, 7, 6, 8]
总共有 种四元组。
需要统计其中最大公约数为1的有多少个。
计算结果为34个(只有1个四元组的最大公约数不为1)。
输出:34
问题分析
直接暴力法不可行
从 个数中选 个的组合数为 ,当 时:
$$C(10000,4) = \frac{10000 \times 9999 \times 9998 \times 9997}{24} \approx 4.17 \times 10^{15}$$显然不能枚举所有四元组。
转化为容斥原理
设:
- = 最大公约数正好为 的四元组个数
- = 最大公约数是 的倍数的四元组个数
那么:
根据莫比乌斯反演:
$$f(d) = \sum_{d|m} \mu\left(\frac{m}{d}\right) g(m)$$我们要求的是 :
其中 是序列中最大数的最大值(不超过10000)。
计算
表示最大公约数是 的倍数的四元组个数。
如何计算?我们需要知道序列中有多少个数是 的倍数。
设 = 序列中是 的倍数的数的个数。
那么从这些数中任选4个,它们的最大公约数一定是 的倍数(但不一定是正好 ,可能是 的更大倍数)。
所以:
即从 个数中选4个的组合数。
计算
对于序列中的每个数 ,枚举 的所有约数 ,然后 。
由于 ,每个数的约数个数最多约 个,所以总复杂度为 ,可以接受。
莫比乌斯函数
需要预先计算 到 ,可以使用线性筛法。
算法步骤
对于每个测试用例:
-
初始化:
- 读取 和序列
- 确定最大值
- 初始化 数组全为0
-
统计 :
- 对于每个数 ,枚举它的所有约数
-
计算 :
- 对于 到 ,
- 组合数可以用公式计算:
-
计算 :
- 预处理莫比乌斯函数
-
输出结果
示例详细计算
第一个测试用例:N=4,序列 [2, 3, 4, 5]
最大值
步骤1:统计
- 2的约数:1,2 → cnt[1]++, cnt[2]++
- 3的约数:1,3 → cnt[1]++, cnt[3]++
- 4的约数:1,2,4 → cnt[1]++, cnt[2]++, cnt[4]++
- 5的约数:1,5 → cnt[1]++, cnt[5]++
结果:
- cnt[1] = 4
- cnt[2] = 2
- cnt[3] = 1
- cnt[4] = 1
- cnt[5] = 1
- 其他 cnt[m] = 0
步骤2:计算
- g(1) = C(4,4) = 1
- g(2) = C(2,4) = 0(因为2<4)
- g(3) = C(1,4) = 0
- g(4) = C(1,4) = 0
- g(5) = C(1,4) = 0
步骤3:计算 莫比乌斯函数:
- μ(1) = 1
- μ(2) = -1
- μ(3) = -1
- μ(4) = 0(4有平方因子2²)
- μ(5) = -1
输出:1
时间复杂度
- 统计 :,其中
- 计算 和 :
- 总复杂度:,可以接受
注意事项
- 序列中的数各不相同
- 使用
long long存储结果,因为结果可能很大 - 组合数计算时注意整数溢出
- 莫比乌斯函数需要预处理到
莫比乌斯函数计算
使用线性筛:
- μ(1) = 1
- 对于质数 p:μ(p) = -1
- 如果数 n 有平方因子:μ(n) = 0
- 否则:μ(n) = (-1)^k,其中 k 是 n 的不同质因数个数
时空限制
- 时间限制:1秒
- 空间限制:64MB