IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【题解】Luogu P2257 YY的GCD -> 正文阅读

[数据结构与算法]【题解】Luogu P2257 YY的GCD

P2257

T T T 组数据。

给定 N , M N,M N,M ,求 1 ≤ x ≤ N , 1 ≤ y ≤ M 1\le x \le N,1\le y \le M 1xN,1yM , gcd ( x , y ) \text{gcd}(x,y) gcd(x,y) 为质数的对数。

T ≤ 1 0 4 ? , ? N , M ≤ 1 0 7 T\le 10^4\ , \ N,M\le 10^7 T104?,?N,M107


Solution

根据题意,其实是求(假设 n < m n<m n<m ):
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) ∈ P r i m e ] \sum_{i=1}^n\sum_{j=1}^{m}[\text{gcd}(i,j)\in Prime] i=1n?j=1m?[gcd(i,j)Prime]
化简式子,先枚举质数:
∑ p ∈ P r i m e ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = = p ] \sum_{p\in Prime}\sum_{i=1}^{n}\sum_{j=1}^{m}[\text{gcd}(i,j)==p] pPrime?i=1n?j=1m?[gcd(i,j)==p]
同时除以 p p p
∑ p ∈ P r i m e ∑ i = 1 ? n p ? ∑ j = 1 ? m p ? [ gcd ( i , j ) = = 1 ] \sum_{p\in Prime}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}[\text{gcd}(i,j)==1] pPrime?i=1?pn???j=1?pm???[gcd(i,j)==1]
我们知道 ? ( x ) = { 1 ???? x = 1 0 ????otherwise \epsilon (x)=\begin{cases}1\ \ \ \ x=1\\0\ \ \ \ \text{otherwise}\end{cases} ?(x)={1????x=10????otherwise?

? = μ ? ? ? 1 = ∑ d ∣ n μ ( d ) \epsilon = \mu \ *\ 1=\large\sum\limits_{d|n}\normalsize\mu(d) ?=μ???1=dn?μ(d)

∑ p ∈ P r i m e ∑ i = 1 ? n p ? ∑ j = 1 ? m p ? ∑ d ∣ gcd ( i , j ) μ ( d ) \sum_{p\in Prime}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}\sum_{d|\text{gcd}(i,j)}\mu(d) pPrime?i=1?pn???j=1?pm???dgcd(i,j)?μ(d)

先枚举 d d d
∑ p ∈ P r i m e ∑ d = 1 ? n p ? μ ( d ) ? ? n p d ? ? ? m p d ? \sum_{p\in Prime}\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)\cdot\lfloor\cfrac{n}{pd}\rfloor\cdot\lfloor\cfrac{m}{pd}\rfloor pPrime?d=1?pn???μ(d)??pdn????pdm??

优化时间复杂度的一个常规操作,令 k = p d k=pd k=pd,枚举 k k k
∑ k = 1 n ∑ p ∈ P r i m e , p ∣ n μ ( k p ) ? ? n k ? ? ? m k ? \sum_{k=1}^{n}\sum_{p\in Prime,p\mid n}\mu(\cfrac{k}{p})\cdot\lfloor\cfrac{n}{k}\rfloor\cdot\lfloor\cfrac{m}{k}\rfloor k=1n?pPrime,pn?μ(pk?)??kn????km??

f ( n ) = ∑ p ∈ P r i m e , p ∣ n μ ( n p ) f(n)=\large\sum\limits_{p\in Prime,p\mid n}\normalsize\mu(\cfrac{n}{p}) f(n)=pPrime,pn?μ(pn?),考虑预处理

n ∈ P r i m e n\in Prime nPrime ,则 f ( n ) = ? 1 f(n)=-1 f(n)=?1

否则,若 n n n 最小的质因子是 r r r ,则

r 2 ∣ n r^2\mid n r2n ,当 n r \cfrac{n}{r} rn? 没有平方因子时, f ( n ) = μ ( n r ) f(n)=\mu(\cfrac{n}{r}) f(n)=μ(rn?) , 否则 f ( n ) = 0 = μ ( n r ) f(n)=0=\mu(\cfrac{n}{r}) f(n)=0=μ(rn?)

r 2 ? p r^2 \nmid p r2?p f ( n ) = ∑ p ∈ P r i m e , p ∣ n μ ( n p ) = μ ( n r ) + ∑ p ∈ P r i m e , p ∣ n r μ ( n p r ) μ ( r ) f(n)=\large\sum\limits_{p\in Prime,p\mid n}\normalsize\mu(\cfrac{n}{p})=\mu(\cfrac{n}{r})+\large\sum\limits_{p\in Prime,p\mid \frac{n}{r}}\normalsize\mu(\cfrac{n}{pr})\mu(r) f(n)=pPrime,pn?μ(pn?)=μ(rn?)+pPrime,prn??μ(prn?)μ(r)

f ( n ) = μ ( n r ) ? ∑ p ∈ P r i m e μ ( n p r ) = μ ( n r ) ? f ( n r ) f(n)=\mu(\cfrac{n}{r})-\large\sum\limits_{p\in Prime}\normalsize\mu(\cfrac{n}{pr})=\mu(\cfrac{n}{r})-f(\cfrac{n}{r}) f(n)=μ(rn?)?pPrime?μ(prn?)=μ(rn?)?f(rn?)

在欧拉筛的时候递推计算即可。

其余部分整除分块,时间复杂度 O ( N + N ) O(N+\sqrt N) O(N+N ?)


AC Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define int long long
using namespace std;

const int SIZE=1e4+5,N=1e7+5;

int T;
int a[SIZE],b[SIZE];
int prime[N],miu[N],v[N],f[N];
int n;

void euler()
{
	int m=0;miu[1]=1;
	for(register int i=2;i<=n;i++)
	{
		if(!v[i]) v[i]=i,miu[i]=-1,f[i]=1,prime[++m]=i;
		for(register int j=1;j<=m;j++)
		{
			if(prime[j]>v[i]||prime[j]*i>n) break;
			v[i*prime[j]]=prime[j];
			miu[i*prime[j]]=(i%prime[j]?-miu[i]:0);
			f[i*prime[j]]=(i%prime[j]?miu[i]-f[i]:miu[i]);
		}
	}
}

signed main()
{
	scanf("%lld",&T);
	for(register int i=1;i<=T;i++)
	{
		scanf("%lld%lld",&a[i],&b[i]);
		if(a[i]>b[i]) swap(a[i],b[i]);
		n=max(n,a[i]);
	}
	euler();    //数据范围较大,离线处理
	for(register int i=2;i<=n;i++) f[i]+=f[i-1];   //前缀和优化
	for(register int i=1;i<=T;i++)
	{
		int ans=0,n=a[i],m=b[i];
		for(register int l=1,r=0;l<=n;l=r+1)    //整除分块
		{
			r=min(n/(n/l),m/(m/l));
			ans+=(f[r]-f[l-1])*(n/l)*(m/l);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 11:59:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:57:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码