首页 > 其他分享 >题解——GCD

题解——GCD

时间:2022-11-30 22:57:32浏览次数:38  
标签:lfloor frac GCD 题解 sum rfloor 质数 gcd

给定正整数 \(n\),求 \(1\le x,y\le n\) 且 \(\gcd(x,y)\) 为素数的数对 \((x,y)\) 有多少对。

\(n\le 10^7\)

题解

做法1

题意即为求\(S=\sum_{质数p|n}\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=p]\)

常规操作化简\(S=\sum_{质数p|n}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{p}\rfloor}[\gcd(i,j)=1]\)

如果我们记\(n'={\lfloor\frac{n}{p}\rfloor},f(i)=\sum_{a=1}^{n'}\sum_{b=1}^{n'}[\gcd(a,b)=i],g(i)=\sum_{i|d}f(d)\)

则展开\(g(i)\)有

\[g(i)=\sum_{i|d}\sum_{a=1}^{n'}\sum_{b=1}^{n'}[\gcd(a,b)=d] \]

常规操作\(g(i)=\sum_{a=1}^{n'}\sum_{b=1}^{n'}\left[i|\gcd(a,b)\right]=\sum_{a=1}^{\lfloor\frac{n'}{i}\rfloor}\sum_{b=1}^{\lfloor\frac{n'}{i}\rfloor}[1|gcd(a,b)]=\left\lfloor\frac{n'}{i}\right\rfloor^2\)

所以\(S=\sum_{质数p|n}f(p)=\sum_{质数p|n}\sum_{d=1}^{dp\le n}\mu\left(d\right)g(p)=\sum_{质数p|n}\sum_{d=1}^{pd\le n}\mu(d)\left\lfloor\frac{n}{dp}\right\rfloor^2\)

接着有设\(T=dp\),这里由于\(p,d\)具有对称性,交换求和次序有\(S=\sum_{T=1}^{n}\lfloor\frac{n}{T}\rfloor^2\sum_{质数p|T}\mu\left({\frac{T}{p}}\right)\)

然后\(\sum_{T=1}^{n}\lfloor\frac{n}{T}\rfloor^2\)可以整除分块,而后面的可以在筛一遍质数之后\(O(\sqrt{n})\)求出,于是复杂度就是\(O(n)\),实际上远远跑不满

做法2

事实上,因为数对具有对称性,我们可以将\(S\)稍稍变形得到

\(S=\sum_{质数p|n}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{p}\rfloor}[\gcd(i,j)=1]=\sum_{质数p|n}\left(2\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^i[\gcd(i,j)=1]-1\right)\)

这个\(-1\)是因为不能让\((p,p)\)统计两次,根据\(\varphi\)的定义,会发现原式等价于\(\sum_{质数p|n}\left(2\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\varphi(i)-1\right)\)

预处理欧拉函数前缀和即可线性求解

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 10000005
#define int long long
int n, phi[N], prime[N], v[N], cnt, s[N];
int init() {
	phi[1] = 1;
	scanf("%lld", &n);
	for (int i = 2; i <= n; i++) {
		if (!v[i]) {
			v[i] = i;
			prime[++cnt] = i;
			phi[i] = i - 1;
		}
		for (int j = 1; j <= cnt; j++) {
			if (prime[j] > v[i] || prime[j] * i > n)break;
			v[prime[j] * i] = prime[j];
			phi[prime[j] * i] = i % prime[j] ? phi[i] * (prime[j] - 1) : phi[i] * prime[j];
		}
	}
	for (int i = 1; i <= n; i++) {
		s[i] = s[i - 1] + phi[i];
	}
	return 0;
}
void solve() {
	int m = n, ans = 0;
	for (int i = 1; i <= cnt; i++) {
		ans += s[m / prime[i]] << 1;
		ans--;
	}
	printf("%lld", ans);
	return;
}
signed main() {
	init();
	solve();
	return 0;
}

标签:lfloor,frac,GCD,题解,sum,rfloor,质数,gcd
From: https://www.cnblogs.com/oierpyt/p/16940064.html

相关文章

  • 题解——阿狸与桃子的游戏
    边权均分-巧妙的阿狸和桃子的游戏[国家集训队]阿狸和桃子的游戏题目描述阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V,E)上进行的,设节点权值为w(v),边权为c(e)。游......
  • 分组——题解
    分组题目背景大样例可在页面底部「附件」中下载。题目描述小C在了解了她所需要的信息之后,让兔子们调整到了恰当的位置。小C准备给兔子们分成若干个小组来喂恰当的......
  • KDOI-3还原数据题解
    「KDOI-03」还原数据题目描述小E正在做一道经典题:给定一个长度为\(n\)的序列\(a\)和\(q\)个操作,操作共有\(2\)种类型:\(\tt{1~l~r~x}\):对于所有\(l\lei\le......
  • 题解——星之界
    题解考虑化简这个可恶的式子\[\prod\limits_{i=l}^{r}C_{\sum_{j=l}^{i}a_j}^{a_i}\]拆开,设\(S\)为前缀和数组\[=\prod^r_{i=l}\frac{(S_i-S_{l-1})!}{a_i!(S_i-S......
  • P8858题解
    折线题目描述平面直角坐标系的第一象限内有一块左下角为\((0,0)\)右上角为\((10^{100},10^{100})\)的矩形区域,区域内有正偶数个整点,试求出这样一条从\((0,0)\)出发......
  • 题解 P1902 刺杀大使
    题解P1902刺杀大使首先注意到,只需要到达一个开关,就可以开启所有开关(打开所有门)所以我们就可以想到,我们要寻找一条从任意\(1-m\)开关(因为访问一个开关就可以开启所有......
  • 你必须要知道的JavaScript数据结构与面试题解答
    英文原文|https://dev.to/educative/7-javascript-data-structures-you-must-know-4k0m原文作者|RyanThelin和AmandaFawcett译文翻译|web前端开发(web_qdkf)解决编码......
  • 【Java】Task07实验4第5题解析
    //TODO1:添加一个字段percent,用以表示百分秒privateintpercent;按照类的封装性要求,字段一般定义为私有的 //TODO2:添加一个只读属性getPercen......
  • 【题解】LOJ #6609 无意识的石子堆 - 感谢强大 alpha!!1【2】
    其实只有三个部分:环的EGF:\(\frac{1}{2}\sum\limits_{i\geq2}\frac{x^iy^i}{i}=\frac{1}{2}\left(\ln\frac{1}{1-xy}-xy\right)\)。链的EGF:\(\frac{1}{2}\frac{xy^2}......
  • 题解 UVA11244
    题解UVA11244题目大意:判断大小为1连通块有几个这个题说实话真的挺水的,你可以考虑用dfs来判断联通块然后记录大小这只是其中一个思路,另一个思路是,直接判断*的8连......