整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


Problem

给你一个正整数 nnn。

请你输出 ∑i=1n∑j=1n∑k=1ngcd⁡(i,j)gcd⁡(i,k)gcd⁡(j,k)\sum\limits_{i=1}^n\sum\limits_{j=1}^n\sum\limits_{k=1}^n \gcd(i,j)\gcd(i,k)\gcd(j,k)i=1∑n​j=1∑n​k=1∑n​gcd(i,j)gcd(i,k)gcd(j,k) 的值,对 998244353998244353998244353 取模。

Solution

首先进行经典欧拉反演:

φ∗1=id⇒n=∑d∣nφ(d)\begin{aligned}\varphi*1&=id\Rightarrow n=\sum_{d|n}\varphi(d)\end{aligned}φ∗1​=id⇒n=d∣n∑​φ(d)​

gcd⁡(i,j)=∑d∣gcd(i,j)φ(d)=∑d∣i∑d∣jφ(d)\begin{aligned}\gcd(i,j)&=\sum_{d|gcd(i,j)}\varphi(d)\\&=\sum_{d|i}\sum_{d|j}\varphi(d)\end{aligned}gcd(i,j)​=d∣gcd(i,j)∑​φ(d)=d∣i∑​d∣j∑​φ(d)​

ans=∑i=1n∑j=1n∑k=1ngcd⁡(i,j)gcd⁡(i,k)gcd⁡(j,k)=∑i=1n∑j=1n∑k=1n∑T1∣i,T1∣jφ(T1)∑T2∣i,T2∣kφ(T2)∑T3∣j,T3∣kφ(T3)=∑T1=1nφ(T1)∑T2=1nφ(T2)∑T3=1nφ(T3)∑T1∣i,T2∣in1∑T1∣j,T3∣jn1∑T2∣k,T3∣kn1=∑T1=1nφ(T1)∑T2=1nφ(T2)∑T3=1nφ(T3)⌊nlcm(T1,T2)⌋⌊nlcm(T1,T3)⌋⌊nlcm(T2,T3)⌋\begin{aligned}ans&=\sum\limits_{i=1}^n\sum\limits_{j=1}^n\sum\limits_{k=1}^n \gcd(i,j)\gcd(i,k)\gcd(j,k)&\\&=\sum\limits_{i=1}^n\sum\limits_{j=1}^n\sum\limits_{k=1}^n\sum\limits_{T_1|i,T_1|j}\varphi(T_1)\sum\limits_{T_2|i,T_2|k}\varphi(T_2)\sum\limits_{T_3|j,T_3|k}\varphi (T_3)&\\& =\sum\limits_{T_1=1}^n\varphi(T_1)\sum\limits_{T_2=1}^n\varphi(T_2)\sum\limits_{T_3=1}^n\varphi(T_3)\sum\limits_{T_1|i,T_2|i}^n1\sum\limits_{T_1|j,T_3|j}^n1\sum\limits_{T_2|k,T_3|k}^n1&\\&=\sum\limits_{T_1=1}^n\varphi(T_1)\sum\limits_{T_2=1}^n\varphi(T_2)\sum\limits_{T_3=1}^n\varphi(T_3)\lfloor\frac{n}{\text{lcm}(T_1,T_2)}\rfloor\lfloor\frac{n}{\text{lcm}(T_1,T_3)}\rfloor\lfloor\frac{n}{\text{lcm}(T_2,T_3)}\rfloor\end{aligned}ans​=i=1∑n​j=1∑n​k=1∑n​gcd(i,j)gcd(i,k)gcd(j,k)=i=1∑n​j=1∑n​k=1∑n​T1​∣i,T1​∣j∑​φ(T1​)T2​∣i,T2​∣k∑​φ(T2​)T3​∣j,T3​∣k∑​φ(T3​)=T1​=1∑n​φ(T1​)T2​=1∑n​φ(T2​)T3​=1∑n​φ(T3​)T1​∣i,T2​∣i∑n​1T1​∣j,T3​∣j∑n​1T2​∣k,T3​∣k∑n​1=T1​=1∑n​φ(T1​)T2​=1∑n​φ(T2​)T3​=1∑n​φ(T3​)⌊lcm(T1​,T2​)n​⌋⌊lcm(T1​,T3​)n​⌋⌊lcm(T2​,T3​)n​⌋​​

然后利用这个科技 P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)

预处理一下 ⌊nlcm(T2,T3)⌋\lfloor\dfrac{n}{\text{lcm}(T_2,T_3)}\rfloor⌊lcm(T2​,T3​)n​⌋,就可以以 O(nlog⁡3n+mm)O(n\log ^3n+m\sqrt{m})O(nlog3n+mm​) 的复杂度计算上述三重和式的解。

Code

// Problem: NIT的gcd
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11191/E
// Memory Limit: 1048576 MB
// Time Limit: 6000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long
using ll = long long;
const int N = 5e6 + 7, mod = 998244353, INF = 0x3f3f3f3f;template <typename T> inline void read(T& t) {int f = 0, c = getchar(); t = 0;while (!isdigit(c)) f |= c == '-', c = getchar();while (isdigit(c)) t = t * 10 + c - 48, c = getchar();if (f) t = -t;
}template <typename T> void print(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) print(x / 10);putchar(x % 10 + 48);
}int n, m, k, t;
int phi[N], primes[N], cnt;
int vis[N], val[N];
int A, B, C;
int minn = INF, maxx;
int edge_cnt;
vector<ll> F[N], G[N];struct Edge
{int u, v, w;
}edge[N];int deg[N];void sieve(int n)
{phi[1] = 1;vis[1] = 1;for( int i = 2; i <= n; ++ i) {if(vis[i] == 0) {primes[ ++ cnt] = i;phi[i] = i - 1;}for( int j = 1; j <= cnt && i * primes[j] <= n; ++ j) {vis[i * primes[j]] = 1;if(i % primes[j] == 0) {phi[i * primes[j]] = 1ll * phi[i] * primes[j] % mod;break;}phi[i * primes[j]] = 1ll * phi[i] * (primes[j] - 1) % mod;}}
}int gcd(int a, int b)
{if(b == 0) return a;return gcd(b, a % b);
}int lcm(int a, int b)
{return 1ll * a / gcd(a, b) * b % mod;
}int f(int a, int b)
{return 1ll * n / lcm(a, b) % mod;
}void init()
{for( int i = 1; i <= maxx; ++ i)deg[i] = 0, G[i].clear();minn = INF;maxx = -INF;edge_cnt = 0;
}void solve()
{init();read(A);n = A;maxx = A;minn = A;ll ans = 0;//三个数都相同for( int i = 1; i <= minn; ++ i) {ans = (ans + 1ll * phi[i] * phi[i] % mod * phi[i] % mod * f(i, i) % mod * f(i, i) % mod * f(i, i) % mod) % mod;}//建图,顺便把有两个数相同情况的贡献算一下for( int x = 1; x <= maxx; ++ x) {for( int k1 = 1; 1ll * k1 * x <= maxx; ++ k1) { for( int k2 = k1 + 1; 1ll * k1 * k2 * x <= maxx; ++ k2) {if(gcd(k1, k2) == 1) {int u = k1 * x;int v = k2 * x;int uuv = 1ll * phi[u] * phi[u] % mod * phi[v] % mod;int uvv = 1ll * phi[u] * phi[v] % mod * phi[v] % mod;ans = (ans + 1ll * uuv * 3 * (f(u, u) % mod * f(u, v) % mod * f(v, u) % mod)) % mod;ans = (ans + 1ll * uvv * 3 * (f(v, v) % mod * f(v, u) * f(u, v) % mod)) % mod;deg[u] ++ ;deg[v] ++ ;++ edge_cnt;edge[edge_cnt].u = u;edge[edge_cnt].v = v;}} }}//均不相同的for( int i = 1; i <= edge_cnt; ++ i) {int u = edge[i].u, v = edge[i].v;if(deg[u] < deg[v] || (deg[u] == deg[v] && u > v)) swap(u, v);G[u].push_back(v);}for(int i = 1; i <= maxx; ++ i) {F[i].resize(G[i].size());for(int j = 0; j < G[i].size(); ++ j) {F[i][j] = f(i, G[i][j]);}}for( int x = 1; x <= maxx; ++ x) {for(auto i : G[x])vis[i] = x, val[i] = f(x, i);for(auto i : G[x]) {int y = i;for(int j = 0; j < G[y].size(); ++ j) {int z = G[y][j];if(vis[z] == x) {int phixyz = 1ll * phi[x] * phi[y] * phi[z] % mod;ans = (ans + 1ll * phixyz * 6 * (val[y] * val[z] * F[y][j] % mod)) %mod; }} }}print(ans);puts("");
}signed main()
{sieve(1e5 + 7);solve();return 0;
}

牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)相关推荐

  1. 【牛客 - 82B】区间的连续段(贪心,建图,倍增)

    题干: 链接:https://ac.nowcoder.com/acm/contest/82/B 来源:牛客网 给你一个长为n的序列a和一个常数k 有m次询问,每次查询一个区间[l,r]内所有数最少分成 ...

  2. 【牛客 - 331D】炫酷路途(二进制枚举 或 建图方式+最短路 或 dfs)

    题干: 小希现在要从寝室赶到机房,路途可以按距离分为N段,第i个和i+1个是直接相连的,只需要一秒钟就可以相互到达. 炫酷的是,从第i个到第i+2pi+2p个也是直接相连的(其中p为任意非负整数),只 ...

  3. 牛客挑战赛47 A 一道GCD问题

    牛客挑战赛47 A 一道GCD问题 思路参考牛客上的题解: 根据多维的更相减损术得gcd(x,y,z)=gcd(x,y−x,z−y)得 gcd(a1+k,a2+k,a3+k-,an+k)=gcd(a1 ...

  4. 牛客挑战赛47 D Lots of Edges(最短路+递归枚举子集)

    牛客挑战赛47 D Lots of Edges 思路:点的权值最多只有(1<<17)-1(131071) ,那我们可以枚举终点的值来算最短路,每个点能连边的值都是固定的,可以通过递归枚举子 ...

  5. 牛客挑战赛47 C 条件(Floyd bitset优化)

    牛客挑战赛47 C 条件 思路:首先我们要两个图,一个是一定能到达的,一个是可能到达的,如果我们使用floyd (n^3)就有可能会超时,因为只要求询问能否到达,所以权值只有0和1,那我们可以使用bi ...

  6. 牛客挑战赛42 A.小睿睿的数列

    牛客挑战赛42 A.小睿睿的数列 题目链接 题目描述 小睿睿给了你一个长度为n的数列,他想问你该数列中满足条件(区间内存在某个数是区间内所有数的公因数)的最长区间有多少个 输入描述: 第一行 111 ...

  7. 牛客挑战赛36 - 纸飞机

    题目链接:牛客挑战赛36 - 纸飞机 题目描述 直线上有n座山峰,第i座的高度为hi.从某座山峰上放飞一架纸飞机,它可以从左往右依次经过一系列高度严格递减的山头. 假设五座山峰的高度依次是3,4,3, ...

  8. 牛客练习赛51 C、勾股定理 只一边求另外两边 结论

    链接:https://ac.nowcoder.com/acm/contest/1083/C 来源:牛客网 勾股定理 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...

  9. 牛客挑战赛34 A 能天使的愿望 (dp 分组背包)

    链接:https://ac.nowcoder.com/acm/contest/2271/A 来源:牛客网 题目描述 出题人寄给大家的一些闲话:参加了CSP-J/S 2019 的同学,考的都怎么样啊?不 ...

最新文章

  1. 《The Elements of Statistical Learning》 chp3 Linear Models for Regression
  2. python可以自学吗-python可以自学吗
  3. setuid与capability
  4. docker 配置加速器
  5. Nginx变身爆火神器,手把手教你在永洪BI中应用
  6. JavaScript对象系统说明图
  7. mysql中使用BETWEEN  AND
  8. iphone新旧手机数据传输已取消_如何取消iPhone手机App自动扣费?三种方法让你不再被“偷”...
  9. Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)
  10. 这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析
  11. yafu安装使用方法以及mismatched parens解决方法
  12. CSS层叠样式表的理解(一)
  13. 甘特图来啦,项目管理神器,模板直接用
  14. 如何在win10下配置MySQL环境变量?
  15. 佳能打印机扫描文件到电脑显示设置计算机,电脑教程:佳能打印机怎么扫描文件到电脑...
  16. 时区相关-这一篇全了解
  17. 2022年度总结|我的CSDN成长历程
  18. 揭开Java上传下载功能的神秘面纱
  19. 输入年月日实现计算这是一年的第几天
  20. webRtc-streamer简单使用-备份

热门文章

  1. Image-to-Image的论文汇总
  2. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影
  3. 超赞!YOLOv5的妙用:学习手语,帮助听力障碍群体
  4. YOLOv5实现自定义对象训练与OpenVINO部署全解析
  5. 青桔单车 chameleon 跨平台实践
  6. JDBC连接Oracle数据库测试
  7. CENTOS php 7.0 +nginx 环境下 安装yaf框架
  8. 欧盟科学家突破纳米尺度高清晰红外显微成像技术
  9. 分享我的第一个asp.net core开发过程
  10. MySQL日期函数的用法几则