当前位置: 首页 > news >正文

SP4191 天空代码 分析

题目概述

问有多少个 \((a,b,c,d)\),在 \(n\) 个数的 \(x\) 满足 \(\gcd\{x_a,x_b,x_c,x_d\}=1\).

其中,\(n,\max x\leq 10^4\)

分析

套路经典题目,记录一下。

\(f(d)\) 表示选 \(4\) 个数,其最大公约数为 \(d\) 的倍数的个数。

\(F(d)\) 表示选 \(4\) 个数,其最大公约数为 \(d\) 的个数。

那么我们 \(f(d)\) 是好求的:

\[f(d)=C_{cnt_d}^{4} \]

我们考虑怎么通过 \(f\)\(F\),只需要考虑容斥即可。

因为我要 \(1\times d\)\(f\),再减去 \(2\times d\)\(f\),再减去 \(3\times d\)\(f\),再加上 \(6\times d\)\(f\) 等等即可。

我们发现这其实就是其分解质因数的个数,容易想到莫比乌斯函数——一个天然的容斥系数。

于是:

\[F(d)=\sum_{d\mid k}\mu(\frac{k}{d})f(k) \]

所以说我们求的 \(F(1)=\sum_{k=1}^{mx}mu(k)f(k)\)

然后直接做就行了哦。

代码

时间复杂度 \(\mathcal{O}(\sum n\sqrt n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <cmath>
#define int long long
#define N 10005
using namespace std;
int gcd(int a,int b) {return b ? gcd(b,a % b) : a;
}
int calc(int x) {if (x <= 3) return 0;return x * (x - 1) * (x - 2) * (x - 3) / 24;
}
int prime[N];
bool vis[N];
int mu[N];
void init(int n) {mu[1] = 1;int cnt = 0;for (int i = 2;i <= n;i ++) {if (!vis[i]) prime[++cnt] = i,mu[i] = -1;for (int j = 1;j <= cnt && prime[j] * i <= n;j ++) {vis[i * prime[j]] = 1;if (i % prime[j] == 0) break;mu[i * prime[j]] = -mu[i];}}
}
int a[N],cnt[N],f[N];
signed main(){init(1e4);int n;int mx = 0;while(~scanf("%lld",&n)) {memset(f,0,sizeof f),memset(cnt,0,sizeof cnt);// for (int i = 0;i <= mx;i ++) f[i] = cnt[i] = 0;mx = 0;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]),mx = max(mx,a[i]);for (int i = 1;i <= n;i ++) {int x = a[i];int t = sqrt(x);for (int j = 1;j <= t;j ++)if (x % j == 0) {cnt[j] ++;if (j != x / j) cnt[x / j] ++;}}for (int i = 1;i <= mx;i ++) f[i] = calc(cnt[i]);int ans = 0;for (int i = 1;i <= mx;i ++) ans += mu[i] * f[i];printf("%lld\n",ans);// int ans = 0;// for (int i = 1;i <= n;i ++)//     for (int j = i + 1;j <= n;j ++)//             for (int k = j + 1;k <= n;k ++)//                     for (int l = k + 1;l <= n;l ++)//                         if (gcd(a[i],gcd(a[j],gcd(a[k],a[l]))) == 1)//                             ans ++;// printf("%lld\n",ans);}return 0;
}
http://www.hskmm.com/?act=detail&tid=34572

相关文章:

  • l2正则化项以及torch.norm
  • 又数据结构
  • 大物实验
  • 蒙特卡洛保形预测技术解析
  • [KaibaMath]1013 关于收敛数列保不等式性的证明
  • 20231408徐钰涵《密码系统设计》
  • 洛谷比赛做题记录
  • 什么是命运(摘抄)
  • 编程指北的 C++
  • Linux grep命令
  • 物品复活软件开发记录 - CelestialZ
  • 螺纹钢的中线节奏
  • 2022 ICPC Hangzhou
  • KL散度
  • Win11常用的bat脚本
  • 随便记
  • Map与Map.Entry的区别
  • 真诚
  • 历史和线段树
  • 大数据分析之MySQL学习2
  • [KaibaMath]1012 关于收敛数列保号性的推论的证明
  • 申公豹说
  • 赛前训练 12 树的直径、中心和重心
  • 关于无人巡航小车的学习笔记
  • 详细介绍:springboot+vue智慧旅游管理小程序(源码+文档+调试+基础修改+答疑)
  • 存算一体架构的先行者:RustFS在异构计算环境下的探索与实践
  • 2-SAT
  • CSP-S模拟10
  • CSP-S模拟赛加赛 比赛总结
  • 我要好好写博客了 - Milo