Coprime
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 400 Accepted Submission(s): 178
Now the Ragnarok is coming. We should choose 3 people to defend the evil. As a group, the 3 people should be able to communicate. They are able to communicate if and only if their id numbers are pairwise coprime or pairwise not coprime. In other words, if their id numbers are a, b, c, then they can communicate if and only if [(a, b) = (b, c) = (a, c) = 1] or [(a, b) ≠ 1 and (a, c) ≠ 1 and (b, c) ≠ 1], where (x, y) denotes the greatest common divisor of x and y.
We want to know how many 3-people-groups can be chosen from the n people.
For each test case, the first line contains an integer n(3 ≤ n ≤ 105), denoting the number of people. The next line contains n distinct integers a1, a2, . . . , an(1 ≤ ai ≤ 105) separated by a single space, where ai stands for the id number of the i-th person.
题意:
给出 T 组样例,每组样例都有个 N,代表有 N 个数,问能有多少种 3 元组组合,使其 3 个任意两者之间互质或者不互质。
思路:
容斥定理 + 筛选。问题的逆命题就是,三者之间的组合存在的关系的:互质,互质,不互质;不互质,不互质,互质。而对于一个数来说,互质 + 不互质 + 1 = n,所以转换为求一个数互质与不互质的个数分别是多少。且通过求互质的数,就可以得出不互质的数是多少。得出这样的结论之后,问题又转化成了求一个数互质的数共有几个。
首先通过筛选的方法,求出每个因子所构成的数在数列中一共有几个,用 ans 数组保存。之后在统计一个数与之互质的总个数时,也可以运用容斥定理求出。
比如 30 的质因子是 2,3,5,那么所求的总数就是 ans [ 2 ] + ans [ 3 ] + ans [ 5 ] - ans [ 2 * 3 ] - ans [ 2 * 5 ] - ans [ 3 * 5 ] + ans [ 2 * 3 * 5 ](如果质因子个数为 n 个,可发现,当为偶数个质因子构成的合数时,总数需要减,而当为奇数时,则需要加,其实就是容斥定理)。
每个数都这样求出来之后加和后,总数还要 / 2,因为一个数被同时算了两次,最后用 C ( n, 3 ) - res 即为所求。记得用 long long 即可。
求每个因子所构成的数在数列中的个数要用筛选的方法,不然会 TLE。
AC:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100005; int n; int num[N], ans[N], pri[N]; bool vis[N]; void init () { memset(ans, 0, sizeof(ans)); memset(vis, 0, sizeof(vis)); } bool test (int x) { if (x == 1) return false; for (int i = 2; i * i <= x; ++i) { if (!(x % i)) return false; } return true; } ll solve () { ll res = 0; for (int i = 0; i < n; ++i) { int now = num[i], sat = 0, sum = 0; int m = 2; while (m * m <= now) { if (!(now % m)) { pri[sum++] = m; while (!(now % m)) now /= m; } ++m; } if (test(now)) pri[sum++] = now; for (int j = 1; j < (1 << sum); ++j) { int sum1 = 0, temp = 1; for (int k = 0; k < sum; ++k) { if ((1 << k) & j) { ++sum1; temp *= pri[k]; } } if (sum1 & 1) sat += ans[temp]; else sat -= ans[temp]; } if (!sat) continue; res += (ll)(sat - 1) * ((ll)n - sat); } return res / 2; } int main () { int t; scanf("%d", &t); while (t--) { scanf("%d", &n); init(); for (int i = 0; i < n; ++i) { scanf("%d", &num[i]); vis[ num[i] ] = 1; } for (int i = 2; i < N; ++i) { for (int j = i; j < N; j += i) { if (vis[j]) ++ans[i]; } } ll res = (ll)n * (n - 1) * (n - 2) / 6; printf("%I64d\n", res - solve()); } return 0; }
相关推荐
sparse coprime array direction of arrival
4. **两两互质检查**:函数`Is_Coprime(m_list)`用于检查所有模数是否两两互质。这是应用中国剩余定理的前提条件之一。 5. **计算每个模数对应的\( M_i \)**:函数`Get_Mi(m_list, M)`用于计算对于每个模数\( m_i \...
"zshz.rar_coprime_判断质数"这个压缩包文件显然包含了一个与数学和编程相关的项目,它涉及到两个主要的概念:质数检测和互质判断。 首先,让我们详细了解一下质数。质数是大于1的自然数,除了1和它本身外,不能被...
费马小定理是数论中一个重要的定理,它定义为a^(p-1) ≡ 1 (mod p),其中a和p是coprime的整数,p是素数。费马小定理的性质包括: * 费马小定理可以用于计算模幂的值 * 费马小定理可以用于证明欧拉公式 * 费马小定理...
中国剩余定理(Chinese Remainder Theorem,CRT)是数论中的一个重要理论,它解决了在模线性同余方程组的问题。简单来说,如果给定一系列模数 \( m_i \) 和对应的余数 \( a_i \),CRT 告诉我们如何找到一个整数 \( x...
宽带到基带频谱检测是无线通信领域中的一项关键技术,它主要应用于认知无线电(CR)网络中。随着移动无线服务和系统的迅速发展,带宽需求不断增加,由此带来了频谱拥堵的问题。认知无线电技术出现,是为了有效解决这一...
本资源包含了基于互质阵列(Coprime Arrays)的解模糊的联合MUSIC算法的MATLAB程序代码。互质阵列是一种特殊的阵列设计,它利用数学上的互质概念来增加阵列的虚拟孔径,从而提高方向估计(DOA)的分辨率。该资源中的...
Correlation imaging is attracting more and more ... We propose a coprime-frequencied sinusoidal modulation method for speckle pattern creation using a spatial light modulator in a computational ghost
此资源提供了基于互质阵列(Coprime Arrays)的差分共阵列空间平滑MUSIC算法的MATLAB程序代码。互质阵列是一种稀疏阵列配置,能够通过较少的物理阵元实现高分辨率的方向估计。该资源中的MATLAB代码利用互质阵列的...
互质阵MUSIC(Coprime Multiple Signal Classification)方法是一种高级的信号处理技术,主要用于空间谱估计和目标定位。在标题和描述中提到的“互质MUSIC”和“互质阵”,指的是该方法的核心概念——互质阵列布局。...
利用MATLAB实现了基于互质阵的DOA估计,相比于传统的DOA算法,基于互质阵的DOA估计能够实现自由度的扩展,提高分辨能力
内容概要: 本资源包含了基于互质阵列(Coprime Arrays)的差分共阵列的无空间平滑的Root-MUSIC算法的MATLAB程序代码。互质阵列是一种利用两个子阵列的互质间距来增加阵列的虚拟孔径,从而提高方向估计(DOA)的...
编码很简单-一个简单的“ N mod coprime”。) 给定一个大小为M的数据块,中国喷泉可以为您提供几乎无限个大小为N的数据包。 “几乎无限”就是小于或等于2 ^ S的互素数的数量,其中S是位的切片大小。 对于32位片来...
该定理指出,如果n是整数,且n=a₁m₁=a₂m₂=…=aₖmₖ,其中a₁,a₂,…,aₖ是整数,m₁,m₂,…,mₖ是pairwise coprime的整数,那么n是m₁,m₂,…,mₖ的最小公倍数的倍数。 五、判断一个数是否能被整除 判断一个...
中国剩余定理(Chinese Remainder Theorem,CRT)是数论中的一个重要概念,它解决了在模线性同余方程组中的求解问题。在实际应用中,尤其是在密码学、编码理论、计算机科学等领域有着广泛的应用。MATLAB作为一种强大...
*(coprime++) = i; // 将 i 存入 coprime 中 } } ``` 5. **最大公约数计算**: ```c int getGcd(int value1, int value2) { int gcd = 0; // 最大公约数 int divisor = 0; // 余数 do { // 辗转相除法 ...
基于多重采样和互质采样的压缩宽谱感知算法研究 通信系统中宽谱感知是一个具有吸引力的研究课题。宽谱感知技术的关键困难在于高采样率的模拟-数字转换器(ADC)的需求。近年来,压缩感知(CS)因能显著降低采样率而...
### 基于被动性的非线性反馈系统鲁棒控制研究 #### 摘要与引言 本文探讨了利用基于算子的右互质因子化方法设计的鲁棒控制器来实现受扰动非线性反馈系统的被动性及鲁棒稳定性问题。针对描述为算子形式的非线性反馈...
素数在数论中有许多有趣的性质,比如欧几里得的无穷多素数定理,费马小定理,以及黎曼ζ函数与素数的关系等。在计算机科学中,素数的应用非常广泛,包括加密算法(如RSA公钥加密)、哈希函数的设计、随机数生成等。 ...
其中提到了Good’s mapping(1960年)应用了中国剩余定理,Rader(1976年)提出了素数长度FFT,Winograd(1976年)提出了Winograd Fourier Transform(WFTA),以及Kolba和Parks在1977年提出了Prime Factor ...