gcd

luogu p4240 毒瘤之神的考验

亡梦爱人 提交于 2019-11-30 19:48:37
题意 : 求 $\sum_{i=1}^{N}{\sum_{j=1}^{M}{\phi(ij)}}; N,M \leq 10^5, q \leq 10^4$ 设 $N \leq M$. 根据$\phi$的性质 可以得到$\phi(ij)=\frac{\phi(i)\phi(j)gcd(i,j)}{\phi(gcd(i,j))}$ 如果这一步没想到,只能说是莫反做的不够多了... $nm$过大的情况下是没法处理乘积的,而且直接这么看也看不出什么性质来 所以考虑把乘在一起的$ij$分开处理。 于是 $\sum_{i=1}^{N}{\sum_{j=1}^{M}{\phi(ij)}} = \sum_{i=1}^{N}{\sum_{j=1}^{M}{\frac{\phi(i)\phi(j)gcd(i,j)}{\phi(gcd(i,j))}}}$, 将$gcd(i,j)$相关提出来 可以得到 $\sum_{i=1}^{N}{\sum_{j=1}^{M}{\frac{\phi(i)\phi(j)gcd(i,j)}{\phi(gcd(i,j))}}}=\sum_{d=1}^{N}{\frac{d}{\phi(d)}\sum_{i=1}^{N/d}{\sum_{j=1}^{M/d}{\phi(id)\phi(jd)}{\sum_{e|gcd(i,j)}{\mu(e)}}}}$ 常规性地开始枚举$e$

luogu五一 数学 day3 数学漫谈

拈花ヽ惹草 提交于 2019-11-30 19:08:32
求证:逆元的存在性 #include<bits/stdc++.h> using namespace std; int main(){ rd(a),rd(b),rd(c),rd(d); //lcm(a*d,b*c) printf("%lf",(a*b*c*d/__gcd(a*d,c*d))/(b*d)); return 0; } 调和级数分析暴力复杂度 输入的时候开一个buck[x]++; dwn(d,1000000,1) 判断d的倍数的个数是否>=k,并输出第一个满足条件的d 枚举rep(i,1,n/d)cnt+=w[d*i]; if(cnt>=k){ printf("%d",d); exit(0); } 复杂度分析 枚举每个d的复杂度是 O(n/d) 的,总复杂度: n/(10w)+n/(10w-1)+n/(10w-2)+...+n/2+n/1 根据调和级数,复杂度为 O(nlogn) ,可以通过本题1e6的数据 自己推柿子 课后作业: 古代猪文 求证:gcd(f[n],f[m])==f[gcd(n,m)]; 引理1: Gcd(F[n+1],F[n])=1; 证明: 根据辗转相减法则 Gcd(F[n+1],F[n]) =gcd(f[n+1]-f[n],f[n]) =gcd(f[n],f[n-1]) . . . =gcd(f[2],f[1]) =1 引理2: f[m+n]=f[m

【iOS】Swift4.0 GCD的使用笔记

元气小坏坏 提交于 2019-11-30 17:49:43
https://www.jianshu.com/p/47e45367e524 前言 在Swift4.0版本中GCD的常用方法还是有比较大的改动,这里做个简单的整理汇总。 GCD的队列 队列是一种遵循先进先出(FIFO)原则的数据结构,是一种特殊的线性表。 主队列 全局队列 串行队列 并行队列 同步 X 并行同步 串行同步 并行同步 异步 串行异步 并行异步 串行异步 并行异步 X 表示禁止这么使用,—— 表示不建议这么使用。 1. 主队列 主队列默认是串行的,另外主队列不能结合同步函数( sync )使用,会造成线程死锁。 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let mainQueue = DispatchQueue.main mainQueue.sync { print("造成当前线程:\(Thread.current)死锁") } } 同时主队列中不应该添加耗时的任务,因为系统的UI相关事务都是在主线程队列中完成的,大量大耗时操作可能会造成卡顿,应该避免。 主队列最常用的方法是当子线程需要通知主线程做一些UI上面的操作时,结合子线程使用: let queue =

Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和

和自甴很熟 提交于 2019-11-30 14:50:22
Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和 【Problem Description】 给你一棵树,树上每个节点都有一个权值。定义 \(1\sim v\) 的最短路径所经过的所有节点 \(u\) 称为 \(v\) 节点的祖先。定义函数 \(f(u,v)=gcd(u,t1,t2,\dots,v)\) ,其中 \(u,t1,t2,\dots\) 都是 \(v\) 的祖先。求 \(\sum f(u,v)\) 。 【Solution】 对于每一个节点 \(v\) 维护一个 \(vector\) 数组,记录其所有祖先 \(u\) 对 \(v\) 的 \(f(u,v)\) 的取值,以及 \(f(u,v)\) 出现的次数。那么对于节点 \(v\) 的儿子节点 \(s\) ,其所有的 \(f(u,s)\) 取值就为所有 \(f(u,v)\) 的取值与 \(a[s]\) 的 \(gcd\) 。对总答案的贡献,只要将取值乘以出现的次数即可。(其实就是很暴力的做法) 【Code】 #include <bits/stdc++.h> using namespace std; typedef int Int; #define int long long #define INF

【模板】辗转相除法

纵然是瞬间 提交于 2019-11-30 11:10:55
处理最大公因数时十分好用(但是我证不出来。。) 原理: gcd(a,b)=gcd(b,a mod b) (b>0) 证明: 设两数为a、b(a>b),用gcd(a,b)表示a,b的 最大公约数 ,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=kr。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。 第一步:令c=gcd(a,b),则设a=mc,b=nc 第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c 第三步:根据第二步结果可知c也是r的因数 第四步:可以断定m-kn与n 互质 (假设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾),因此c也是b与r的最大公约数。 从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。 (以上摘自百度词条) 还挺好懂的啊。。 代码: 大概过程就是当a%b=0时说明b是最小公因数 看看代码吧。。 int gcd(int a,int b) { if(b==0) return a; else gcd(b,a%b); } 一道例题: (点击收获RP++) 很简单啦。。解释写成注释了 #include<iostream> #include

GCD、LCM

只谈情不闲聊 提交于 2019-11-30 06:23:11
GCD-最大公约数 inline int GCD(int a,int b){return b==0?a:GCD(b,a%b);} LCM-最小公倍数 inline int KCM(int a,int b){return a/GCD(a,b)*b;} 来源: https://www.cnblogs.com/jian-song/p/11567745.html

GCD - Extreme (II) UVA - 11426

吃可爱长大的小学妹 提交于 2019-11-30 00:27:50
题意:输入正整数n , 求gcd(1 ,2)+gcd(1 ,3)+gcd(2,3)+. . . +gcd(n-1,n)时,即所有满足1 <= i <j<=n 的数对(i,j)所对应的gcd(i,j)之和。比如n= l0 时答案为67 , n=100 时答案为13 015 , n=200 000时答案为143295493 160 。 设f(n)=gcd(1 ,n)+gcd(2 ,n)+gcd(3 ,n)+…+gcd(n-1, ,n), 所求答案为S(n)=f(2)+f(3)+…f(n) 。 只需求出f(n) , 就可以递推出所有答案: S(n)=S(n-1)+f(n) 。 注意到所有gcd(x,n)的值都是n 的约数,可以按照这个约数进行分类,用g(n, i)表示满足gcd(x,n)=i 且x<n 的正整数x 的个数,则f(n)=sum{i*g(n, i) | i 是n 的约数}。 注意到gcd(x,n)=i的充要条件是gcd(x/i,n/i)=1(此时x/i和n/i互质), 因此满足条件的x/i 有phi(n/i)个,说明g(n , i)=phi(n/i) 。 问题到这里还没有结束。如果依次计算j例,需要对每个n 枚举它的约数i , 速度较慢,但如果把思路逆转过来,对于每个i 枚举它的倍数n (并且更新j(n) 的值) ,时间复杂度将降为与素数筛法同阶。 #include

模拟44 题解

江枫思渺然 提交于 2019-11-29 21:13:59
A. D 显然对于每一个点,它左侧的区间 gcd 是单调不增的。 因为 gcd 一旦减少至少减半,不同取值不超过 log 个。 从左到右扫一遍的过程中,维护一个单调的 pair 数组。 第一维为区间 gcd 值,第二维为左端点下标。 显然我们只关心同一个 gcd 值最小的左端点。 不断维护一下这个元素个数不超过 log 的单调数组, 暴力修改更新答案就可以。 复杂度貌似是 $O(nlog^2n)$ 的, 然而如果均摊的话,每个数调用 gcd 是 log 级别的,总复杂度应为 $O(nlogn)$ 。 B. E 最近做了很多这类关于区间的题,大致思路都是排序后叹息。 还是首先将 2n 个数排序。 考虑 2n 个数中的最小值和最大值。 如果最值不在同一组中, 那么有两种情况: 1.最值被分到 R 。 那么另一个组应该取得极差最小的 n 个属于不同组元素。 显然的单调指针问题,思路类似数颜色的莫队做法。 2. 最小值被分到 R ,最大值被分到 B 。 则一个最小值和一个最大值固定了。 显然使 R 取得每组的最小值, B 取得每组的最大值。 任何交换都使答案更差。 C. F 首先是最弱智的dp,考虑两个指针的位置。 稍微思考一下发现只要一个指针的位置就可以了,因为另一个指针的位置一定指向前一个操作应值的位置。 然后dp就省掉了一维,稍微观察一下转移,线段树优化就完了。 来源: https:

扩展欧几里得算法详解(exgcd)

牧云@^-^@ 提交于 2019-11-29 17:24:40
一、前言 本博客适合已经学会欧几里得算法的人食用~~~ 二、扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做 贝祖定理 的玄学定理: 即如果a、b是整数,那么一定存在整数x、y使得$ax+by=gcd(a,b)$。 通俗的说就是:如果$ax+by=c$有解,那么$c\%gcd(a,b)=0$ 来源: https://www.cnblogs.com/szmssf/p/11524295.html

exam9.6&&7

蹲街弑〆低调 提交于 2019-11-29 16:51:36
emmm 改题稍紧张,以后几篇并一起写 9.6 (前十并没有参加本次考试) 于是我就rank8了 一道题一道题来 先说T1:   显然是一个高精度GCD,于是打算用计算器算一下时间复杂度   众所周知gcd是log的   于是...      按这样算显然会T对吧   所以我放弃了   但考后发现   计算器运算优先级锅了   其实是:      完全可过   P.S.鉴于高精取模并不好打,我yy出了多一个log的只用高精加&&减的做法 代码:    #include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; #define int long long char ch[105]; struct num{ int a[1005]; int opt; friend num operator +(num a,num b) { num c;int k=0; c.clear(); c.a[0]=max(a.a[0],b.a[0]); /*cout<<"add:"<<endl; a.out(),b.out(); cout<<a.a[0]<<" "<<b.a[0]<<endl;*/ for(int q=1;q<=c.a[0];q++) { c.a[q]=a.a[q]*(q<