题目大意

给出一段序列,求其中最大公约数为1的四元组的个数。

思路

我们要用到反演、正难则反的思想。对于每一个大于1的数字\(x\),求出最大公约数为\(x\)的四元组的个数\(g(x)\),然后用排列中所有四元组的组合个数减去\(\sum g(x)\)即可。

直接求\(g(x)\)没有什么思路,但是求公约数中存在\(x\)的四元组的个数\(f(x)\)会比较容易。枚举约数中存在x的数列元素的个数\(n\),则有

\[f(x)=C_n^4
\]

那么怎么把\(f(x)\)变为\(g(x)\)呢?这要用到莫比乌斯反演。

莫比乌斯反演

莫比乌斯函数

\[\mu(x)=
\begin{cases}
1 &\text{若$x$=1}\\
0 &\text{若对$x$质因数分解得到的每个质数的次数中存在大于1的}\\
(-1)^k &\text{$k$为$x$的质因数个数}
\end{cases}
\]

莫比乌斯反演公式

\[f(x)=\sum_{k=1}^{\lfloor \frac{N}{x}\rfloor}g(kx)\tag{1}
\]

\[g(x)=\sum_{k=1}^{\lfloor \frac{N}{x}\rfloor}f(kx)\mu(k)
\]

我们发现这道题若把序列中的数字最大值作为\(N\),\(f(x),g(x)\)恰好满足该关系(1)。于是我们跟着公式求\(g(x)\)即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define ll long long const int MAX_N = 10010, MAX_R = 5, MAX_PRIME_CNT = MAX_N;
ll C[MAX_N][MAX_R];
int Num[MAX_N], Mu[MAX_N];
ll F[MAX_N]; void GetMu(int *mu, int n)
{
static bool NotPrime[MAX_N];
static int prime[MAX_PRIME_CNT];
memset(NotPrime, false, sizeof(NotPrime));
int primeCnt = 0;
mu[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!NotPrime[i])
{
prime[primeCnt++] = i;
mu[i] = -1;
}
for (int j = 0; j < primeCnt; j++)
{
if (i*prime[j] > n)
break;
NotPrime[i*prime[j]] = true;
if (i%prime[j] == 0)
{
mu[i*prime[j]] = 0;
break;
}
else
mu[i*prime[j]] = -mu[i];
}
}
} void GetC(int r, int n)
{
memset(C, 0, sizeof(C));
for (int i = 1; i <= n; i++)
{
C[i][0] = 1;
for (int j = 1; j <= min(i, r); j++)
{
if (i == j)
C[i][j] = 1;
else
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
}
}
} ll Proceed(int maxN, int n)
{
memset(F, 0, sizeof(F));
for (int i = 2; i <= maxN; i++)
{
int cnt = 0;
for (int j = 1; j <= maxN / i; j++)
cnt += Num[i * j];
F[i] = C[cnt][4];
}
ll ans = 0;
for (int i = 2; i <= maxN; i++)
for (int j = 1; j <= maxN / i; j++)
ans += F[i * j] * Mu[j];
return C[n][4] - ans;
} int main()
{
GetMu(Mu, 10000);
GetC(4, 10000);
int n, maxN = 0, x;
while (~scanf("%d", &n))
{
memset(Num, 0, sizeof(Num));
for (int i = 1; i <= n; i++)
{
scanf("%d", &x);
Num[x]++;
maxN = max(maxN, x);
}
printf("%lld\n", Proceed(maxN, n));
}
return 0;
}

luogu2714 四元组统计 莫比乌斯反演 组合数的更多相关文章

  1. POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数

    http://poj.org/problem?id=3904   题意:给一些数,求在这些数中找出四个数互质的方案数.   莫比乌斯反演的式子有两种形式http://blog.csdn.net/out ...

  2. 【容斥原理,莫比乌斯反演】用容斥替代莫比乌斯反演第二种形式解决gcd统计问题

    名字虽然很长.但是其实很简单,对于这一类问题基本上就是看你能不能把统计的公式搞出来(这时候需要一个会推公式的队友) 来源于某次cf的一道题,盼望上紫的我让潘学姐帮我代打一道题,她看了看跟我说了题解,用 ...

  3. hdu.5212.Code(莫比乌斯反演 && 埃氏筛)

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  4. UVa 10214 (莫比乌斯反演 or 欧拉函数) Trees in a Wood.

    题意: 这道题和POJ 3090很相似,求|x|≤a,|y|≤b 中站在原点可见的整点的个数K,所有的整点个数为N(除去原点),求K/N 分析: 坐标轴上有四个可见的点,因为每个象限可见的点数都是一样 ...

  5. [模板] 容斥原理: 二项式反演 / Stirling 反演 / min-max 容斥 / 子集反演 / 莫比乌斯反演

    //待更qwq 反演原理 二项式反演 若 \[g_i=\sum_{j=1}^i {\binom ij} f_j\] , 则有 \[ f_i=\sum_{j=1}^i (-1)^{i-j} {i \ch ...

  6. CF915G Coprime Arrays 莫比乌斯反演、差分、前缀和

    传送门 差分是真心人类智慧--完全不会 这么经典的式子肯定考虑莫比乌斯反演,不难得到\(b_k = \sum\limits_{i=1}^k \mu(i) \lfloor\frac{k}{i} \rfl ...

  7. 【BZOJ2671】Calc(莫比乌斯反演)

    [BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...

  8. luoguP4466 [国际集训队]和与积 莫比乌斯反演

    自然想到枚举\(gcd(a, b)\),不妨设其为\(d\),并且\(a = di, b = dj(a > b)\) 那么\(\frac{ab}{a + b} = \frac{dij}{i + ...

  9. 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组

    [BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...

随机推荐

  1. facade 模式和gateway模式的区别

    原文:http://stackoverflow.com/questions/4422211/what-is-the-difference-between-facade-and-gateway-desi ...

  2. 5.12redis

    Window配置Redis环境和简单使用 一.关于Redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序 ...

  3. JQuery 数据加载中禁止操作页面

    比较常见的做法,但对我而言是第一次做,记录一下. 为了把找来的loading.gif 的背景色设置为透明,还特意装了quicktime. 有学到一些额外的东西. 先将div及img定义好 <bo ...

  4. SQLServer 在存储过程里使用事务控制的简单小例子

    alter proc sp_test(     @name varchar(50))asbegin    --开始事务   begin transaction   --设置一个存储报错代码的变量   ...

  5. [转]深入javascript——原型链和继承

    在上一篇post中,介绍了原型的概念,了解到在javascript中构造函数.原型对象.实例三个好基友之间的关系:每一个构造函数都有一个“守护神”——原型对象,原型对象心里面也存着一个构造函数的“位置 ...

  6. 【VB】api实现窗口最小化

    Const WM_SYSCOMMAND = &H112 Const SC_MINIMIZE = &HF020& SendMessage hWnd, WM_SYSCOMMAND, ...

  7. JDK自带工具

    工具名称 描述 appletviewer.exe 用于运行并浏览applet小程序. apt.exe 注解处理工具(Annotation Processing Tool),主要用于注解处理. extc ...

  8. ANE打包

    哈哈,曾经梦寐以求的ANE终于弄成功了一个.说实话,学java和Android就是为了写ANE!好啦,今天把我体会到的记录一下: 网上其实打包ANE的教程好多,我也找了好多好多.但是好多我自己试了还是 ...

  9. 【Hexo】deploy出错的解决方法

    .ERROR Deployer not found: git 执行npm install hexo-deployer-git --save .$ hexo d INFO Deploying: git ...

  10. .NET 解决方案 核心库整理

    一系列令人敬畏的.NET核心库,工具,框架和软件: https://www.cnblogs.com/weifeng123/p/11039345.html 企业级解决方案收录:  https://www ...