CO-PRIME
时间限制: 1000 ms | 内存限制: 65535 KB
难度: 3
- 描写叙述
-
This problem is so easy! Can you solve it?
You are given a sequence which contains n integers a1,a2……an, your task is to find how many pair(ai, aj)(i < j) that ai and aj is co-prime.
- 输入
- There are multiple test cases. Each test case conatains two line,the first line contains a single integer n,the second line contains n integers. All the integer is not greater than 10^5. 输出
- For each test case, you should output one line that contains the answer. 例子输入
-
31 2 3
例子输出 -
3
參考学长博客
题意:给出n个正整数。求这n个数中有多少对互素的数。
分析:
此题中,设F(d)表示n个数中gcd为d的倍数的数有多少对,f(d)表示n个数中gcd恰好为d的数有多少对。
则F(d)=∑f(n) (n % d == 0)
f(d)=∑mu[n / d] * F(n) (n %d == 0)
上面两个式子是莫比乌斯反演中的式子。
所以要求互素的数有多少对,就是求f(1)。
而依据上面的式子能够得出f(1)=∑mu[n] * F(n)。
所以把mu[]求出来。枚举n即可了,当中mu[i]为i的莫比乌斯函数。
初探莫比乌斯。还有非常多不是非常懂。跟进中。
。
。
转载请注明出处:
题目链接:
#include#include #include using namespace std;const int MAXN = 1e5+10;typedef long long LL;LL F[MAXN],f[MAXN];int pri[MAXN],pri_num;int mu[MAXN];//莫比乌斯函数值int vis[MAXN],a[MAXN];void mobius(int N) //筛法求莫比乌斯函数{ pri_num = 0;//素数个数 memset(vis, 0, sizeof(vis)); vis[1] = mu[1] = 1; for(int i = 2; i <=N; i++) { if(!vis[i]) { pri[pri_num++] = i; mu[i] = -1; } for(int j=0; j