一、最大公因数
1.定义
-
设a1,...,ana_1,...,a_na1,...,an是n(n≥2)n(n\geq2)n(n≥2)个整数。若整数ddd是它们中每一个数的因数,则ddd就叫做a1,...,ana_1,...,a_na1,...,an的一个公因数。
-
设a1,...,ana_1,...,a_na1,...,an不全为000。那么整数a1,...,ana_1,...,a_na1,...,an的所有公因数中最大的一个公因数就叫做最大公因数。若整记作(a1,...,an)(a_1,...,a_n)(a1,...,an)。
-
当(a1,...,an)=1(a_1,...,a_n)=1(a1,...,an)=1时,称a1,...,ana_1,...,a_na1,...,an互素或互质。
2.性质
-
设a1,...,ana_1,...,a_na1,...,an是nnn个不全为零的整数,则:
- a1,...,ana_1,...,a_na1,...,an与∣a1∣,...,∣an∣|a_1|,...,|a_n|∣a1∣,...,∣an∣的公因数相同
- (a1,...,an)=(∣a1∣,...,∣an∣)(a_1,...,a_n)=(|a_1|,...,|a_n|)(a1,...,an)=(∣a1∣,...,∣an∣)
-
设bbb是任一正整数,则(0,b)=b(0,b)=b(0,b)=b。
-
[a,b]=ab(a,b)[a,b]=\frac{ab}{(a,b)}[a,b]=(a,b)ab
3.求解最大公因数
(1)暴力法
暴力枚举每一个数,并暴力的去寻找每一个数的因数,以此来更新当前的最大公因数。
ll gcd=a[1];
for(ll i=2;i<=n;i++)
{for(ll j=min(gcd,a[i]);j>=2;j--){if(a[i]%j==0 && gcd%j==0){gcd=j;break;}}
}
时间复杂度O(n⋅avg)O(n\cdot avg)O(n⋅avg)。
(2)辗转相除法
性质:设a,b,ca,b,ca,b,c是三个不全为000的整数,并假设a>ba>ba>b,qqq也是整数。如果a=q⋅b+ca=q\cdot b+ca=q⋅b+c,则(a,b)=(b,c)(a,b)=(b,c)(a,b)=(b,c)。
故而,要求(a,b)(a,b)(a,b)只需求(b,c)(b,c)(b,c)即可,如此反复即为辗转相除法,时间复杂度大大降低。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>using namespace std;
typedef long long ll;ll gcd(ll a,ll b)
{if(b==0)return a;return gcd(b,a%b);
}
int main()
{ll num[100],n;cin>>n;for(ll i=1;i<=n;i++)cin>>num[i];ll ans=0;for(ll i=1;i<=n;i++)ans=gcd(ans,num[i]);cout<<ans<<endl;return 0;
}
辗转相除法本身的时间复杂度为O(logalog2b)O(loga\ log^2b)O(loga log2b)。
二、同余的基本介绍
1.定义
给定一个正整数mmm,两个整数a,ba,ba,b叫做模mmm同余,如果a−ba-ba−b被mmm整除,或m∣a−bm|a-bm∣a−b,就记作a≡b(modm)a\equiv b(mod\ m)a≡b(mod m)。否则,叫做模mmm不同余,记作a≢b(modm)a\not\equiv b(mod\ m)a≡b(mod m)。
2.基本性质
- 自反性:对任一整数aaa,有a≡a(modm)a\equiv a(mod\ m)a≡a(mod m)。
- 对称性:若a≡b(modm)a\equiv b(mod\ m)a≡b(mod m),则b≡a(modm)b\equiv a(mod\ m)b≡a(mod m).
- 传递性:若a≡b(modm)a\equiv b(mod\ m)a≡b(mod m),b≡c(modm)b\equiv c(mod\ m)b≡c(mod m),则a≡c(modm)a\equiv c(mod\ m)a≡c(mod m)。
若一个关系有上面三个关系,则称为等价关系。
三、同余的运算
1.加法与乘法
设mmm是一个正整数,设a1,a2,b1,b2a_1,a_2,b_1,b_2a1,a2,b1,b2是444个整数,如果:
a1≡b1(modm),a2≡b2(modm)a_1\equiv b_1(mod\ m),a_2\equiv b_2(mod\ m) a1≡b1(mod m),a2≡b2(mod m)
则可以满足以下运算规则:
- a1+a2≡b1+b2(modm)a_1+a_2\equiv b_1+b_2(mod\ m)a1+a2≡b1+b2(mod m)
- a1⋅a2≡b1⋅b2(modm)a_1\cdot a_2\equiv b_1\cdot b_2(mod\ m)a1⋅a2≡b1⋅b2(mod m)
2.运算性质
-
设mmm是一个正整数,设d⋅a≡d⋅b(modm)d\cdot a\equiv d\cdot b(mod\ m)d⋅a≡d⋅b(mod m)。如果(d,m)=1(d,m)=1(d,m)=1,则a≡b(modm)a\equiv b(mod\ m)a≡b(mod m)。
-
设mmm是一个正整数,设a≡b(modm),d>0a\equiv b(mod\ m),d>0a≡b(mod m),d>0,则d⋅a≡d⋅b(modd⋅m)d\cdot a\equiv d\cdot b(mod\ d\cdot m)d⋅a≡d⋅b(mod d⋅m)。
-
设mmm是一个正整数,设a≡b(modm)a\equiv b(mod\ m)a≡b(mod m),如果整数d∣(a,b,m)d|(a,b,m)d∣(a,b,m),则ad≡bd(modmd)\frac{a}{d}\equiv \frac{b}{d}(mod\ \frac{m}{d})da≡db(mod dm)。
-
设m1,...,mkm_1,...,m_km1,...,mk是kkk个正整数,设a≡b(modmi),i=1,...,ka\equiv b(mod\ m_i),i=1,...,ka≡b(mod mi),i=1,...,k,则a≡b(mod[m1,...,mk])a\equiv b(mod\ [m_1,...,m_k])a≡b(mod [m1,...,mk])。
3.快速幂
ll quickpow(ll a,ll p,ll mod)
{if(a==0)return 0;while(p){if(p&1)ans=ans*a%mod;a=a*a%mod;p>>=1;}return ans;
}
四、作业
P1888 三角函数
P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
P1372 又是毕业季I
P1414 又是毕业季II