首页 > 其他分享 >C. 最大公约数

C. 最大公约数

时间:2024-05-02 16:34:42浏览次数:11  
标签:gcd limits cdot sum mid varphi 最大公约数

C. 最大公约数

求 \(\sum\limits_{i=1}^n\dfrac{n}{gcd(i,n)}\)。

先考虑用欧拉函数解决。考虑枚举 \(d=\gcd(i,n)\) 的取值。式子变成 \(\sum\limits_{d\mid n}\sum\limits_{i=1}^n[\gcd(i,n)=d]\cdot\dfrac{n}{d}\)。

对于 \(\gcd(a,b)=d\),有 \(\gcd(\frac{a}{d},\frac{b}{d})=1\)。

所以 \(\sum\limits_{d\mid n}\sum\limits_{i=1}^{\frac{n}{d}}[\gcd(i,\frac{n}{d})=1]\cdot\dfrac{n}{d}\)。

而明显,在 \(\frac{n}{d}\) 中与它互质的数即为 \(\varphi(\frac{n}{d})\)。

\(\sum\limits_{d\mid n}\dfrac{n}{d}\cdot\varphi(\frac{n}{d})\)

\(=\sum\limits_{d\mid n}d\cdot\varphi(d)\)

设 \(f(n)=\sum\limits_{d\mid n}d\cdot\varphi(d)\),可以证明,\(f(n)\) 是积性函数。

证明:

\(\because\gcd(a,b)=1\)

\(\therefore\) \(ab\) 的因子一部分来自 \(a\),一部分来自 \(b\)。

\(f(ab)=\sum\limits_{d\mid ab}d\cdot\varphi(d)=\sum\limits_{d\mid a}\sum\limits_{d'\mid b}dd'\cdot\varphi(dd')\)

又 \(\because \varphi(dd')=\varphi(d)\varphi(d')\)

\(f(ab)=\sum\limits_{d\mid n}d\cdot\varphi(d)\sum\limits_{d'\mid n}d'\cdot\varphi(d')=f(a)f(b)\)

证毕。

直接线性筛计算积性函数即可。

关于如何计算,设 \(x=i\times pri_j\):

  1. 当 \(i\) 是质数时,\(f(i)=i\times(i-1)+1\);

  2. 当 \(pri_j\mid i\) 时,分两种情况,\(i\) 不是最小质因数的幂次,\(f(x)=f(low_x)f(x/low_x)\),\(low_x\) 为 \(x\) 的最小质因数的最大幂次;\(i\) 是小质因数的幂次,一般有规律可以计算,因为因数易知,比如这里就可以写成 \(f(x)=f(i)+pri_j\cdot\varphi(pri_j)\)。

  3. 当 \(pri_j\nmid i\) 时,\(f(x)=f(i)f(pri_j)\)。

总结:此类题的思路就是先化简式子,先看看能不能有欧拉函数做,再考虑莫反。最后证明此函数是积性函数,直接线性筛预处理做到 \(O(n)\) 多次询问。

标签:gcd,limits,cdot,sum,mid,varphi,最大公约数
From: https://www.cnblogs.com/FireRaku/p/18170300

相关文章

  • 力扣-1979. 找出数组的最大公约数
    1.题目介绍题目地址(c-力扣(LeetCode))https://leetcode.cn/problems/find-greatest-common-divisor-of-array/题目描述给你一个整数数组nums,返回数组中最大数和最小数的最大公约数。两个数的 最大公约数是能够被两个数整除的最大正整数。 示例1:输入:nums=[2,5,6......
  • 质数、最大公约数经典问题整理
    1、计数质数MX=5000000is_prime=[1]*MXis_prime[0]=is_prime[1]=0foriinrange(2,MX):ifis_prime[i]:forjinrange(i*i,MX,i):is_prime[j]=0classSolution:defcountPrimes(self,n:int)->int:return......
  • 【知识点】欧几里得算法求最大公约数
    最大公约数所为的最大公约数,是指两个或多个整数共有的约数中最大的那个数。换句话说,它是能同时整除给定的整数的最大整数。例如,对于整数\(12\)和\(18\),它们的公约数有\(1、2、3、6\),其中最大的公约数为6,因此它们的最大公约数为\(6\)。最大公约数通常用符号\(\gcd(a,b)\)......
  • 求最大公约数和最小公倍数
    1.最大公约数辗转相除法intt;while(b!=0){t=a%b;a=b;b=t;}printf("thegcdis%d\n",a);2.最小公倍数最小公倍数乘以最大公约数等于两数乘积,所以最小公倍数等于两数乘积除以最大公约数。include<stdio.h>include<math.h>intmain(void){printf("pleaseinputtwo......
  • 编写一个函数,找到两个数的最大公约数
    /***********************************************************************************filename:004_最大公约数.cauthor:[email protected]:2024/04/18function:算出两个数的最大公约数note:No......
  • 最大公约数和最小公倍数
    最大公约数(GCD)和最小公倍数(LCM)最大公约数定义:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数;几个自然数公有的约数,叫做这几个自然数的公约数;公约数中最大的一个公约数,称为这几个自然数的最大公约数(greatestcommond......
  • 洛谷题单指南-数学基础问题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • 三十 3999. 最大公约数 (欧拉函数)
    3999.最大公约数(欧拉函数)importjava.util.*;publicclassMain{privatestaticintT;privatestaticlonga,m;privatestaticlonggcd(longa,longb){returnb==0?a:gcd(b,a%b);}privatestaticlonge......
  • 二十五 4199. 公约数 (最大公约数|二分)
    4199.公约数(最大公约数|二分)思路:先用求最大公约数的模板求出a与b的最大公约数d,然后得到从1到d的全部公约数,最后利用二分法找到满足l≤x≤r条件的最大的公约数x。importjava.util.*;publicclassMain{privatestaticinta,b,q,l,r,cnt;privatestati......
  • 求最大公约数的方法---pta---N个数求和
    公约数,简单来讲,可以被两个数都整除的一个数。最大公约数,就是两个数的所有公约数中最大的那一个。求得方法有很多,比如://枚举法inta,b,t;cin>>a>>b;for(inti=1;i<=min(a,b);i++){if(a%i==0&&b%i==0){t=i;}}cout<<t;//辗转相除法:inta,b,t;cin>>a>>b;......