公约数

迭代算法

泄露秘密 提交于 2020-02-25 07:11:48
转自: http://www.cnblogs.com/jessy/articles/2455226.html 迭代算法 军人在进攻时常采用交替掩护进攻的方式,若在数轴上的点表示A,B两人的位置,规定在前面的数大于后面的数,则是A>B,B>A交替出现。但现在假设军中有一个胆小鬼,同时大家又都很照顾他,每次冲锋都是让他跟在后面,每当前面的人占据一个新的位置,就把位置交给他,然后其他人再往前占领新的位置。也就是A始终在B的前面,A向前迈进,B跟上,A把自己的位置交给B(即执行B = A操作),然后A 再前进占领新的位置,B再跟上……直到占领所有的阵地,前进结束。像这种两个数一前一后逐步向某个位置逼近的方法称之为迭代法。 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 二、建立迭代关系式。所谓迭代关系式

蓝桥杯 公约数公倍数

前提是你 提交于 2020-01-23 14:10:52
最小公倍数 #include<stdio.h> int main(){ int i,a,b; scanf("%d%d",&a,&b); for (i=a;;i++){ if(i%a==0&&i%b==0) { printf("%d",i);break; } } return 0; } 最小公约数与交换 #include<stdio.h> void Swap(int *a,int *b) { *a^=*b; *b^=*a; *a^=*b; } GYS(int a,int b) { int c; while(a%b!=0) { c=a%b; a=b; b=c;} return b; } int main() { int a,b; puts("Please input a and b:"); scanf("%d%d",&a,&b); Swap(&a,&b); printf("%d and %d \n最大公约数为:%d\n",a,b,GYS(a,b)); return 0; } 呐呐呐呐。。。看到一个不错的求公约数的优雅代码: int gcd (int m,int n) { if (n==0) return m; return gcd (n,m%n); }  来源: https://www.cnblogs.com/zhangzimu/p/6104237.html

求两个数最大公约数的几种方法

匿名 (未验证) 提交于 2019-12-03 00:18:01
1.”分析“:在求公约数时,我们可以考虑将所有的公约数都求出来放入列表中,然后再求出最大值即可 def func6(m,n): if m < n: m,n = n,m for i in range(1,n+1): lis =[] if m % i == 0 and n % i == 0: lis.append(i) else: return False return max(lis) 2.“分析”:利用欧几里得算法 def func7(m,n): if m < n: m,n = n,m r = m%n while r !=0: m = n n = r r = m%n return n print(func7(15,25)) 文章来源: 求两个数最大公约数的几种方法

luoguP1306 斐波那契公约数

两盒软妹~` 提交于 2019-12-01 08:48:15
令 \(n<=m\) \[ \begin{eqnarray}f[n+2]&=&f[n]*f[1]+f[n+1]*f[2]\\ f[n+3]&=&f[n]*f[2]+f[n+1]*f[3]\\ &......&\\ f[m]&=&f[n]*f[m-n-1]+f[n+1]*f[m-n] \end{eqnarray} \] \[ \begin{align} \gcd(f[n],f[m])&=\gcd(f[n],f[n]*f[m-n-1]+f[n+1]*f[m-n])\\ &=\gcd(f[n],f[n+1]*f[m-n])\\ &=\gcd(f[n],f[m-n])\\ &=\gcd(f[n],f[m\%n]) \end{align} \] 就是辗转相除啦! \[ \begin{align} \gcd(f[n],f[m])=f[\gcd(n,m)] \end{align} \] 然后用矩阵快速幂优化即可. #pragma GCC optimize(3) #include<bits/stdc++.h> #define il inline #define rg register #define gi read<int> using namespace std; const int mod=1e8; template<class TT> il TT read() { TT o = 0, fl

洛谷$P1390$ 公约数的和 莫比乌斯反演/欧拉函数

久未见 提交于 2019-11-30 15:47:58
正解:莫比乌斯反演/欧拉函数 解题报告: 传送门$QwQ$ 首先显然十分套路地变下形是趴 $\begin{align*}&=\sum_{i=1}^n\sum_{j=1}^n gcd(i,j)\\&=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^{min(i,j)} [gcd(i,j)==d]\cdot d\\&=\sum_{d=1}^{n}d\cdot \sum_{i=1}^n\sum_{j=1}^n [gcd(i,j)==d]\\\end{align*}$ 这时候有两个选择,一个是莫反一个是欧拉函数 欧拉函数的话就很$easy$?直接戳我 简要总结 里常见套路第一条,就能$O(n)$做了$QwQ$ 然后莫反就其实也挺套路的,,,直接套个板子上去,记得加个数论分块.$over$ 来源: https://www.cnblogs.com/lqsukida/p/11601828.html

P1306 斐波那契公约数

ぃ、小莉子 提交于 2019-11-26 18:13:07
题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? Update:加入了一组数据。 输入格式 两个正整数n和m。(n,m<=10^9) 注意:数据很大 输出格式 Fn和Fm的最大公约数。 由于看了大数字就头晕,所以只要输出最后的8位数字就可以了。 输入输出样例 输入 #1 4 7 输出 #1 1 说明/提示 用递归&递推会超时 用通项公式也会超时 一篇超棒的题解(偷个懒) 代码: #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=10000010; const int mod=1e8; long long n,m; struct no { long long a[3][3]; long long r,c; }; no mul(no x,no y) { no p; memset(&p,0,sizeof(p)); for(int i=0; i<x.r; i++) for(int j=0; j<y.c; j++) for(int k=0; k<x.c; k++) p.a[i][j]=

[luogu1390]公约数的和

为君一笑 提交于 2019-11-26 09:54:44
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 2000005 4 long long n,ans,f[N],vis[N],p[N]; 5 void mobies(int n){ 6 f[1]=1; 7 for(int i=2;i<=n;i++){ 8 if (!vis[i])f[p[++p[0]]=i]=i-1; 9 for(int j=1;j<=p[0];j++){ 10 if (p[j]*i>n)break; 11 vis[i*p[j]]=1; 12 if (i%p[j]==0)f[i*p[j]]=f[i]*p[j]; 13 else f[i*p[j]]=f[i]*(p[j]-1); 14 } 15 } 16 for(int i=2;i<=n;i++)f[i]+=f[i-1]; 17 } 18 int main(){ 19 mobies(N-5); 20 scanf("%lld",&n); 21 for(int i=1,j;i<=n;i=j+1){ 22 j=n/(n/i); 23 ans+=(f[j]-f[i-1])*(n/i)*(n/i); 24 } 25 printf("%lld",(ans-n*(n+1)/2)/2); 26 } View Code 来源: https://www.cnblogs