假诺存在一个平头q,则c|kp c和p没有公因子 =&gt

【SinGuLaRiTy-1004】 Copyright (c) SinGuLaRiTy 2017 . All Rights
Reserved.

【SinGuLaRiTy-1004】 Copyright (c) SinGuLaRiTy 2017 . All Rights
Reserved.

有的数论基本定律

整除

整除

( a + b ) mod c = ((a mod c) + (b mod c))
mod c

基本概念

设a,b为整数,且a不为0,假设存在1个平头q,使得a*q=b,则b能被a整除,记为a|b,且称b是a的倍数,a是b的因子。

基本概念

设a,b为整数,且a不为0,尽管存在多少个整数q,使得a*q=b,则b能被a整除,记为a|b,且称b是a的倍数,a是b的因子。

( a * b ) mod c = ((a mod c) * (b mod
c)) mod c

性质

(1)如果a|b且b|c,则a|c ;
(2)a|b且a|c等价于对于自由的平头x,y,有a|(bx+cy) ;
(3)设m不为0,则a|b等价于ma|mb ;
(4)设整数x,y满足下式:ax+by=1,且a|n,b|n,那么(ab)|n ;
(5)若b=q*d+c,那么d|b的充要条件是d|c ;

<补充拓展>

(1)若2能整除a的最最后一位,则2|a

注脚:若原数减去协调的最末尾,得到的数一定能被10整除,即一定能被2整除,又因为最末尾也能被2整除,则原数一定能被2整除
(2)若4能整除a的末两位,则4|a

证实:原理与(1)的貌似。若原数减去本身的末两位尾数,获得的数一定能被100整除,即一定能被4整除,又因为末两位也能被4整除,则原数一定能被4整除
(3)若8能整除a的末叁人,则8|a

证明:原理与(1)(2)相似。
(4)若3能整除a的各位数字之和,则3|a

证实:设随意二个数S=a\10^0+b*10^1+c*10^2+d*10^3+……*

*                                 
=(a+b+c+d+……)+9b+99c+999d+9999e+……*

*         
由于3|(a+b+c+d+……),3|(9b+99c+999d+9999e+……),则3|S*
(5)若9能整除a的各位数字之和,则9|a

证明:原理与(4)相同。
(6)若11能整除a的偶数位数字之和与奇数位数字之和的差,则11|a

注解:设随意一个数S=a\10^0+b*10^1+c*10^2+d*10^3+……*

*                                 
=(a-b+c-d+……)+11b+99c+1001d+……*

*         
 由于11|(a-b+c-d+……),11|(11b+99c+1001d+……),则11|S*
(7)能被柒 、1壹 、13整除的数的特点是:这一个数的末几个人与末四个人从前的数字所结合数之差能被柒 、1① 、13整除。

证明:原理与(6)相同。

性质

(1)如果a|b且b|c,则a|c ;
(2)a|b且a|c等价于对于自由的平头x,y,有a|(bx+cy) ;
(3)设m不为0,则a|b等价于ma|mb ;
(4)设整数x,y满足下式:ax+by=1,且a|n,b|n,那么(ab)|n ;
(5)若b=q*d+c,那么d|b的充要条件是d|c ;

<补充拓展>

(1)若2能整除a的最最后一位,则2|a

表明:若原数减去团结的最末尾,获得的数一定能被10整除,即一定能被2整除,又因为最末尾也能被2整除,则原数一定能被2整除
(2)若4能整除a的末两位,则4|a

表达:原理与(1)的相似。若原数减去协调的末两位尾数,获得的数一定能被100整除,即一定能被4整除,又因为末两位也能被4整除,则原数一定能被4整除
(3)若8能整除a的末三个人,则8|a

证明:原理与(1)(2)相似。
(4)若3能整除a的诸位数字之和,则3|a

证实:设随意一个数S=a\10^0+b*10^1+c*10^2+d*10^3+……*

*                                 
=(a+b+c+d+……)+9b+99c+999d+9999e+……*

*         
由于3|(a+b+c+d+……),3|(9b+99c+999d+9999e+……),则3|S*
(5)若9能整除a的诸位数字之和,则9|a

证明:原理与(4)相同。
(6)若11能整除a的偶数位数字之和与奇数位数字之和的差,则11|a

证实:设随意一个数S=a\10^0+b*10^1+c*10^2+d*10^3+……*

*                                 
=(a-b+c-d+……)+11b+99c+1001d+……*

*         
 由于11|(a-b+c-d+……),11|(11b+99c+1001d+……),则11|S*
(7)能被柒 、1壹 、13整除的数的性状是:那么些数的末几个人与末贰人以前的数字所构成数之差能被柒 、1壹 、13整除。

证明:原理与(6)相同。

 

GCD & LCM:

*相似的,设a1,a2,a3,……ak是k个正整数,假使存在三个正整数d,使得d|a1,d|a2,……d|ak,那么d则为a1,a2,……ak的公约数,当中最大的称之为最大公约数,即为gcd(a1,a2,……,ak),分明它是存在的,至少为1。当gcd=1时,称那n个数是互质的或既约的。公约数一定是最大公约数的约数。

*相似的,设a1,a2,a3,……ak是k个正整数,假诺存在一个正整数d,使得a1|d,a2|d,a3|d,……ak|d,那么d则为a1,a2,……ak的倍数,当中不大的号称最小公倍数数,记为lcm。

GCD & LCM:

*诚如的,设a1,a2,a3,……ak是k个正整数,要是存在二个正整数d,使得d|a1,d|a2,……d|ak,那么d则为a1,a2,……ak的公约数,在那之中最大的名叫最大公约数,即为gcd(a1,a2,……,ak),分明它是存在的,至少为1。当gcd=1时,称那n个数是互质的或既约的。公约数一定是最大公约数的约数。

*诚如的,设a1,a2,a3,……ak是k个正整数,如若存在1个正整数d,使得a1|d,a2|d,a3|d,……ak|d,那么d则为a1,a2,……ak的翻番,当中十分的小的称之为最小公倍数数,记为lcm。

消去律:若 gcd(c,p) = 1,则 ac ≡ bc mod
p => a ≡ b mod p

<欧几里得算法(辗转相除法)>

gcd(a,b)=gcd(b,a%b)
性质:若a,b为偶数,则gcd(a,b)=2*gcd(a/2,b/2);若a偶b奇,则gcd(a,b)=gcd(a/2,b)。

<实现代码>

long long gcd(long long x,long long y){  
        if(x>y)return gcd(y,x);  
        if(x==0)return y;  
        return gcd(y%x,x);  
}  

由于有lcm(a,b)*gcd(a,b)=a*b,则lcm(a,b)=a*b/gcd(a,b)。

<欧几里得算法(辗转相除法)>

gcd(a,b)=gcd(b,a%b)
性质:若a,b为偶数,则gcd(a,b)=2*gcd(a/2,b/2);若a偶b奇,则gcd(a,b)=gcd(a/2,b)。

<达成代码>

long long gcd(long long x,long long y){  
        if(x>y)return gcd(y,x);  
        if(x==0)return y;  
        return gcd(y%x,x);  
}  

由于有lcm(a,b)*gcd(a,b)=a*b,则lcm(a,b)=a*b/gcd(a,b)。

消去律注脚: ac ≡ bc mod p => ac =
bc + kp => c(a-b) = kp

勾股数:

对叶昭君整数x,y,z,就算知足等式:x^2+y^2=z^2,则称那组整数(x,y,z)为勾股数。换句话说,凡是足以整合直角三角形的平头即称为勾股数。
x,y,z两两互质的勾股数称为基本勾股数,如(3,4,5),(5,12,13),其余勾股数称为派生勾股数。基本勾股数乘以二个周密则能够得到派生勾股数。
基本勾股数的奇偶性?
自然是二奇一偶,且最大的为奇数。
负有的基本勾股数都得以写成如下情势:
x=2mn,y=m^2-n^2,z=m^2+n^2 (m>n)
透过它能够枚举基本勾股数。

勾股数:

对张晓芸整数x,y,z,若是满足等式:x^2+y^2=z^2,则称这组整数(x,y,z)为勾股数。换句话说,凡是能够组成直角三角形的平头即称为勾股数。
x,y,z两两互质的勾股数称为基本勾股数,如(3,4,5),(5,12,13),别的勾股数称为派生勾股数。基本勾股数乘以二个周密则能够取得派生勾股数。
基本勾股数的奇偶性?
自然是二奇一偶,且最大的为奇数。
享有的基本勾股数都得以写成如下格局:
x=2mn,y=m^2-n^2,z=m^2+n^2 (m>n)
透过它能够枚举基本勾股数。

c和p没有除1以外的公因子 => 1)
c能整除k 或 2) a = b 借使2不创建,则c|kp c和p没有公因子 =>
c|k,

<勾股数完全公式>

a=m,b=(m^2/k-k) / 2,c=(m^2/k+k)/2 其中m≥3
⒈ 当m分明为随意一个≥3的奇数时,k={1,m^2的持有小于m的因子}
⒉ 当m分明为私自二个 ≥4的偶数时,k={m^2 / 2的兼具小于m的偶数因子}
经过此公式可以求出全数的基本勾股数和派生勾股数,并得以求出给定a
时勾股数的组数。

<勾股数完全公式>

a=m,b=(m^2/k-k) / 2,c=(m^2/k+k)/2 其中m≥3
⒈ 当m鲜明为随意1个≥3的奇数时,k={1,m^2的装有小于m的因数}
⒉ 当m显明为专断3个 ≥4的偶数时,k={m^2 / 2的全体小于m的偶数因子}
经过此公式能够求出全部的基本勾股数和派生勾股数,并能够求出给定a
时勾股数的组数。

为此k = ck’ =>
c(a-b)=kp可以表示为c(a-b) =ck’p 因而a-b = k’p,得出a ≡ b mod p

<求勾股数的组数>

当a给定时,不相同勾股数组a,b,c的组数N等于①式中k的可取值个数

取奇数a=P1^M1×P2^M2×……×Pr^Mr,个中k={1,a^2的装有小于a的因数},则k的可取值个数:
N=[(2*M1+1)×(2M2+1)×……×(2Mr+1)-1]/2

取偶数a=2^M0×P1^M1×P2^M2×……×Pr^Mr,当中k={a^2/2的具有小于a的偶数因子},则k的可取值个数:
N=[(2M0-1)×(2M1+1)×(2M2+1)×……×(2Mr+1)-1]/2
内部,P1,P2,……,Pr为有差别的奇素数,M0,M1,……,Mr为幂指数。

<求勾股数的组数>

当a给定时,分歧勾股数组a,b,c的组数N等于①式中k的可取值个数

取奇数a=P1^M1×P2^M2×……×Pr^Mr,在那之中k={1,a^2的富有小于a的因数},则k的可取值个数:
N=[(2*M1+1)×(2M2+1)×……×(2Mr+1)-1]/2

取偶数a=2^M0×P1^M1×P2^M2×……×Pr^Mr,当中k={a^2/2的兼具小于a的偶数因子},则k的可取值个数:
N=[(2M0-1)×(2M1+1)×(2M2+1)×……×(2Mr+1)-1]/2
里头,P1,P2,……,Pr为迥然分化的奇素数,M0,M1,……,Mr为幂指数。

 

模运算:

模运算:

快速幂

<小平头的幂取模>

#define LL long long int
LL power(int a,int b,int p) //a^b%p
{
   int t=a,res=1;
   while(b)
   {
   if(b&1)
         res=res*t%p;
         t=t*t%p;
         b>>=1;
     }
}

<小平头的幂取模>

#define LL long long int
LL power(int a,int b,int p) //a^b%p
{
   int t=a,res=1;
   while(b)
   {
   if(b&1)
         res=res*t%p;
         t=t*t%p;
         b>>=1;
     }
}

图片 1图片 2

<大整数的模乘法>

#define LL long long int
LL mul(LL a, LL b, LL p)  //a*b%p
{  
     LL rn=0, i;  
     for(i=1; i<=b; i<<=1,a=(a<<1)%p)
         if(b&i) 
             rn=(rn+a)%p;  
     return rn;  
}

<大整数的模乘法>

#define LL long long int
LL mul(LL a, LL b, LL p)  //a*b%p
{  
     LL rn=0, i;  
     for(i=1; i<=b; i<<=1,a=(a<<1)%p)
         if(b&i) 
             rn=(rn+a)%p;  
     return rn;  
}
int Pow
(int a,int b)
{
    //快速求a^b ,复杂度 log(b)
    if(b == 0)
        return 1;
    if(b & 1)   //b是奇数
    {
        return a * Pow(a,b-1);
    }
    else
    {
        int t = Pow
                (a,b/2);
        return t * t;
    }
}

<大整数的幂取模>

#define LL long long int
LL ksm(LL a, LL b, LL p)  
{  
     LL rn=1;  
     for(; b; a=mul(a,a,p),b>>=1)  
         if(b&1) 
             rn=mul(rn,a,p);  
     return rn;  
} 

<大整数的幂取模>

#define LL long long int
LL ksm(LL a, LL b, LL p)  
{  
     LL rn=1;  
     for(; b; a=mul(a,a,p),b>>=1)  
         if(b&1) 
             rn=mul(rn,a,p);  
     return rn;  
} 

快速幂1

素数:

对于一个正整数n,就算它的约数唯有1和n,则称n为质数。质数不分包1。
(1)素数有无穷多个。
(2)不超过n的素数个数可粗略估摸为n/ln(n)
(3)任何大于1的非素数n,那么在[1,sqrt(n)]间隔内至少存在三个素数。

素数:

对此四个正整数n,假设它的约数唯有1和n,则称n为质数。质数不分包1。
(1)素数有无穷八个。
(2)不超过n的素数个数可粗略测度为n/ln(n)
(3)任何大于1的非素数n,那么在[1,sqrt(n)]间隔内至少存在二个素数。

图片 3图片 4

<整数唯一分解定理>

随机1个压倒1的平头n,均可以象征为多少个素数的乘积,且这一个情势是绝无仅有的。
n=p1^m1*p2^m2*……pk^mk
里面,p1,p2,……pk 为n的质因子。

<整数唯一分解定理>

自由二个超越1的整数n,均能够代表为多少个素数的乘积,且那几个方式是唯一的。
n=p1^m1*p2^m2*……pk^mk
当中,p1,p2,……pk 为n的质因子。

int Pow(int a,int b)
{
    //快速求a^b ,复杂度 log(b)
    int result = 1;
    int base = a;
    while(b)
    {
        if( b & 1)
            result *= base;
        base *= base;
        b >>= 1;
    }
    return result;
}

<不难的素数判断>

bool prime(int num)
{
    for(int i=2;i*i<=num;i++)
    {
        if(num%i==0)
            return 0;
     return 1;
    }
}

*频率更高的【米勒罗宾素数判定法】

<简单的素数判断>

bool prime(int num)
{
    for(int i=2;i*i<=num;i++)
    {
        if(num%i==0)
            return 0;
     return 1;
    }
}

*频率更高的【Miller罗宾素数判定法】

快速幂2

<线性时间筛素数>

//法一
const in MAXN=1000000+10;
const int MAXP=70000;
int vis[MAXN];
int prime[MAXP]
void sieve(int n)
{
 int m=(int)sqrt(n+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;i++)
if(!vis[i])
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
}

//法二
int prime[MAXP];
bool flag[MAXN];
int j=0;
for(int i=2;i<=n;i++)
{
   if(flag[i]==0)
    prime[j++]=i;
    for(int k=0;k<j;k++)
    {
       if(prime[k]*i>n)break;
       flag[prime[k]*i]=1;
       if(i%prime[k]==0)break;
    }
}

<线性时间筛素数>

//法一
const in MAXN=1000000+10;
const int MAXP=70000;
int vis[MAXN];
int prime[MAXP]
void sieve(int n)
{
 int m=(int)sqrt(n+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;i++)
if(!vis[i])
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
}

//法二
int prime[MAXP];
bool flag[MAXN];
int j=0;
for(int i=2;i<=n;i++)
{
   if(flag[i]==0)
    prime[j++]=i;
    for(int k=0;k<j;k++)
    {
       if(prime[k]*i>n)break;
       flag[prime[k]*i]=1;
       if(i%prime[k]==0)break;
    }
}

 

同余:

若a%m=b%m,则称a与B关于模m同余,记为a≡b(mod m)
性质:
(1)自反性: a≡a(mod m)
(2)对称性:若 a≡b(mod m),则 b≡a(mod m)
(3)传递性:若a≡b(mod m),b≡c(mod m),则 a≡c(mod m)
(4)同加性:若a≡b(mod m),则a+c≡b+c(mod m)
(5)同乘性:若a≡b(mod m),则a*c≡b*c(mod m)
若a≡b(mod m),c≡d(mod m),则有a*c≡b*d(mod m)
(6)同幂性:若a≡b(mod m),则an≡bn(mod m)
(7)若a%p=x,a%q=x,且p,q互质,则a%(p*q)=x

同余:

若a%m=b%m,则称a与B关于模m同余,记为a≡b(mod m)
性质:
(1)自反性: a≡a(mod m)
(2)对称性:若 a≡b(mod m),则 b≡a(mod m)
(3)传递性:若a≡b(mod m),b≡c(mod m),则 a≡c(mod m)
(4)同加性:若a≡b(mod m),则a+c≡b+c(mod m)
(5)同乘性:若a≡b(mod m),则a*c≡b*c(mod m)
若a≡b(mod m),c≡d(mod m),则有a*c≡b*d(mod m)
(6)同幂性:若a≡b(mod m),则an≡bn(mod m)
(7)若a%p=x,a%q=x,且p,q互质,则a%(p*q)=x

迅猛幂取模

<同余分配率>

加法分配率:(a+b)%n=(a%n+b%n)%n
减法分配率:(a-b)%n=(a%n-b%n)%n
乘法分配率:(a*b)%n=a%n*b%n%n
除法不满足分配率,但有那天性格:(a/b)%n=a%(bn)/b

<同余分配率>

加法分配率:(a+b)%n=(a%n+b%n)%n
减法分配率:(a-b)%n=(a%n-b%n)%n
乘法分配率:(a*b)%n=a%n*b%n%n
除法不满意分配率,但有这几个天性:(a/b)%n=a%(bn)/b

 

<剩余系>

给定n,则有所整数对n取模,将获得1个集结,称为模n的剩余系,即{0,1,2,……,n-1}.
n的剩余系中与n互质的数称为简化剩余系,也称为缩系。n的剩余系记为Zn,而n的缩系记为Zn*.
模n的剩余系中,种种元素都代表全数与它同余的平头,比如n=7,则1象征{1,8,15,22,……},那一个集合满足模n同余关系,称为同余等价类。

<剩余系>

给定n,则有所整数对n取模,将收获一个会面,称为模n的剩余系,即{0,1,2,……,n-1}.
n的剩余系中与n互质的数称为简化剩余系,也称为缩系。n的剩余系记为Zn,而n的缩系记为Zn*.
模n的剩余系中,各类元素都代表全部与它同余的整数,比如n=7,则1代表{1,8,15,22,……},那么些集合满足模n同余关系,称为同余等价类。

图片 5图片 6

<威尔逊定理>

若p为素数,则(p-1)!≡-1(mod p)。 其逆定理也建立。

<威尔逊定理>

若p为素数,则(p-1)!≡-1(mod p)。 其逆定理也成立。

int PowMod(int a,int b,int c)
{
    //快速求 a^b % c ,要避免计算中间结果溢出
    int result = 1;
    int base = a%c;
    while(b)
    {
        if( b & 1)
            result = (result * base)%c;
        base = (base * base) % c;
        b >>= 1;
    }
    return result;
}

<费马定理>

若P为素数,a为正整数,且a和P互质,则有:a^p-1≡  1(mod p)

<费马定理>

若P为素数,a为正整数,且a和P互质,则有:a^p-1≡  1(mod p)

快快幂取模

<欧拉定理>

欧拉函数phi:不超过n的且与n互质的正整数的个数。
如果n为素数p,则 phi(p)=p-1
如果n为素数p的幂次p^a,则 phi(p^a)=(p-1)*p^(a-1).
欧拉函数为积性函数:如若n为任意三个互质的数a、b的积,则 phi(n)=
phi(a)* phi(b)

n=p1a1*p2a2*……*pkak
则  (n)=n*(1-1/p1)*(1-1/p2)*……*(1-1/pk)

欧拉定理:
若a与m互质,则图片 7

<欧拉函数总括>

//法一
int euler(int n)
{
  int m=(int)sqrt(n+0.5);
  int ans=n;
for(int i=2;i<=m;i++)if(n%i==0)
{
  ans=ans/i*(i-1);
  while(n%i==0)n/=i;
}
if(n>1)ans=ans/n*(n-1);
return ans;
}

//法二(此方法更快)
int phi[maxn];
void phi_table(int n)
{
for(int i=2;i<=n;i++)phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++)if(!phi[i])
for(int j=i;j<=n;j+=i){
if(!phi[j])phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}

<扩充欧几里得算法>

对于随意整数a,b,一定期存款在整数x、y,使得ax+by=gcd(a,b)若gcd(a,b)=1,则早晚存在整数x,y,使得ax+by=1能够选用扩充欧几Reade算法求出x,y。

void gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b){x=1;d=a;y=0;}
else {
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}

x即为a的逆元(->数学中的求导)。

运用:

(1)求二元3回方程:ax+by=c
(2)求模线性方程:ax≡b (mod n)
(3)求逆元:ab≡1 (mod n)
(4)求gcd(a,b)

<欧拉定理>

欧拉函数phi:不超越n的且与n互质的正整数的个数。
如果n为素数p,则 phi(p)=p-1
如果n为素数p的幂次p^a,则 phi(p^a)=(p-1)*p^(a-1).
欧拉函数为积性函数:万一n为任意七个互质的数a、b的积,则 phi(n)=
phi(a)* phi(b)

n=p1a1*p2a2*……*pkak
则  (n)=n*(1-1/p1)*(1-1/p2)*……*(1-1/pk)

欧拉定理:
若a与m互质,则图片 8

<欧拉函数总计>

//法一
int euler(int n)
{
  int m=(int)sqrt(n+0.5);
  int ans=n;
for(int i=2;i<=m;i++)if(n%i==0)
{
  ans=ans/i*(i-1);
  while(n%i==0)n/=i;
}
if(n>1)ans=ans/n*(n-1);
return ans;
}

//法二(此方法更快)
int phi[maxn];
void phi_table(int n)
{
for(int i=2;i<=n;i++)phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++)if(!phi[i])
for(int j=i;j<=n;j+=i){
if(!phi[j])phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}

<增加欧几里得算法>

对此自由整数a,b,一定期存款在整数x、y,使得ax+by=gcd(a,b)若gcd(a,b)=1,则早晚存在整数x,y,使得ax+by=1能够使用增添欧几Reade算法求出x,y。

void gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b){x=1;d=a;y=0;}
else {
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}

x即为a的逆元(->数学中的求导)。

运用:

(1)求二元一回方程:ax+by=c
(2)求模线性方程:ax≡b (mod n)
(3)求逆元:ab≡1 (mod n)
(4)求gcd(a,b)

 

<模线性方程&中夏族民共和国剩余定理>

有如下方程:

      图片 9

其中n1,n2,……,nk互质。

中原剩余定理正是用来求解模线性方程组的。
对于n1,因为它与(n2*n3……*nk)互质,我们得以找到3个全面z1,使得z1*(n2*n3*……nk)%n1=1。设z1*(n2*n3*……*nk)为c1。
同理,对于各类nk,都足以找到多个zi,使得zi*(n1*n2*……*nj
|j!=i)%ni=1,设zi*(n1*n2*……*nj |j!=i)为ci。

x=b1*c1+b2*c2+……bk*ck+m(n1*n2*…*nk) 在那之中m为任意整数。
x为一组解。

<模线性方程&中夏族民共和国剩余定理>

有如下方程:

      图片 10

其中n1,n2,……,nk互质。

神州剩余定理正是用来求解模线性方程组的。
对此n1,因为它与(n2*n3……*nk)互质,我们得以找到1个周详z1,使得z1*(n2*n3*……nk)%n1=1。设z1*(n2*n3*……*nk)为c1。
同理,对于每种nk,都足以找到1个zi,使得zi*(n1*n2*……*nj
|j!=i)%ni=1,设zi*(n1*n2*……*nj |j!=i)为ci。

x=b1*c1+b2*c2+……bk*ck+m(n1*n2*…*nk) 在那之中m为任意整数。
x为一组解。

 

<模乘法的逆>

如果(a*b)%n=1,则称a与b模n互为尾数,记为a=b^(-1)
,b=a^(-1),那是模乘法的逆。
若a与n互质,则必存在一个平头b,使得a*b%n=1,即a模n的逆元一定期存款在。
若b存在逆元,则有(a/b)%n=(a*b^(-1))%n。
    申明:设b的逆元为c,则bc%n=1
    (a/b)%n=((a/b)*bc)%n=a*c%n=a*b^(-1)%n 

 

Time:2017-02-07

 

<模乘法的逆>

如果(a*b)%n=1,则称a与b模n互为尾数,记为a=b^(-1)
,b=a^(-1),那是模乘法的逆。
若a与n互质,则必存在1个平头b,使得a*b%n=1,即a模n的逆元一定期存款在。
若b存在逆元,则有(a/b)%n=(a*b^(-1))%n。
    注明:设b的逆元为c,则bc%n=1
    (a/b)%n=((a/b)*bc)%n=a*c%n=a*b^(-1)%n 

 

Time:2017-02-07

 

等比数列二分求和取模

Sn= a+a2+…+an 供给 Sn
mod p 假诺用公式算,或许溢出,因此用二分法求

若 n是偶数

**Sn= a+…+an/2 + an/2+1

  • an/2+2 +…+ an/2+n/2 =(a+…+an/2) + an/2(a+…+an/2)**

    =Sn/2+ an/2Sn/2
=(1+an/2)Sn/2

若n是奇数

Sn= a+…+a(n-1)/2 +
a(n-1)/2+1 +… + a(n-1)/2+(n-1)/2 + a(n-1)/2+(n-1)/2 + 1

    =S(n-1)/2 +
a(n-1)/2(a+…+a(n-1)/2)+an =(1+a(n-1)/2)S(n-1)/2+an

 

图片 11图片 12

int PowSumMod(int a,int n,int p)
{
    // return (a+ a^2 + ... + a^n) Mod p;
    if( n == 1)
        return a%p;
    if( n %2 == 0)
        return (1+PowMod(a,n/2,p))*PowSumMod(a,n/2,p) % p;
    else
        return ((1+PowMod(a,(n-1)/2,p)) * PowSumMod(a,(n-1)/2,p)+ PowMod(a,n,p)) % p;
}

等比数列二分求和取模

 

 

POJ3233
Matrix Power Series

矩阵火速幂+等比数列二分求和取模

给多少个 n
× n 的整数矩阵 A 和正整数k,m,

** 令 S = A

  • A 2 + A 3 + … + A k 求 S mod m**


(S的每种都 mod m) n (n ≤ 30), k (k ≤ 109 ) and m (m < 104
)

 

图片 13图片 14

struct Matrix
{
    T a[32][32];
    int r; //行列数
    Mat(int rr):r(rr) { }
    void MakeI()   //变为单位矩阵
    {
        memset(a,0,sizeof(a));
        for(int i = 0; i < r; ++i)
            a[i][i] = 1;
    }
};
Matrix Pow(const Matrix & m,int k,int p)
{
    //求mk mod p
    int r = m.r;
    Matrix result(r);
    result.MakeI(); //MakeI是将result变为单位矩阵
    Matrix base = m;
    while(k)
    {
        if( k & 1)
            result = Product(result,base,p); //result*base mod p
        k >>= 1;
        base = Product(base,base,p);
    }
    return result;
}

矩阵火速幂+等比数列二分求和取模

 

 

欧几里得算法求最大公约数

 

图片 15图片 16

int Gcd(int a,int b)
{
    if( b == 0)
        return a;
    return Gcd(b,a%b);
}

gcd

 

最小公倍数:lcm(a,b) = a*b/gcd(a,b)

 

扩展欧几里得算法

ax+by=gcd(a,b)

有整数解(x,y) <=>
bx+(a%b)y = gcd(a,b)

有整数解(x1,y1),且 x =
y1, y = x1-[a/b]*y1

所以,能够在求gcd(a,b)的同时,对
ax+by=gcd(a,b)求解

图片 17图片 18

int GcdEx
(int a,int b,int &x ,int & y)
//求 ax+by=gcd(a,b)的整数解,返回gcd(a,b)
{
    if( b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    int x1,y1;
    int gcd = GcdEx(b,a%b,x1,y1);
    x = y1;
    y = x1- a/b * y1;
    return gcd;
}

exgcd

ax+by=c 有解的充要条件是

gcd(a,b)|c • 设 d = gcd(a,b), k =
c/d, ax+by = d的解是 (x1,y1)

则 ax+by = c的解集是: x = k*x1 +
t*(b/d) y = k*y1 – t*(a/d) t为随意整数

 

恢宏欧几里得算法求ax ≡ c(mod b)

求ax ≡ c(mod b)等价于求 ax+by =

设 d = gcd(a,b), k = c/d, ax+by =
d的解是 (x1,y1)

则ax≡c(mod b) 的解集是: x = k*x1 +
t*(b/d) t为随意整数 其中模b不相同的解共有 d 个,为: x = k*x1 + t*(b/d)
t=0,1,..d-1

求ax ≡ c(mod b) 的蝇头非负整数解: 令
ans = k * x1; s = b/d; 则 x = ans + t*s t为随意整数

则小小的非负整数解是:(ans%s +
s)%s

 

华夏剩余定理

 

 

外甥定理,神帅韩信点兵,隔墙算,鬼谷算,大衍求一术…

“物不知数”难题:”今有物不知其数,三三数之剩二,五
五数之剩三,七七数之剩二,问物几何?答曰:’二十三.’
术曰:三三数之剩二,置一百四十,五五数之剩三,置六
十三,七七数之剩二,置三十,并之,得二百三十三,以二
百一十减之,即得.凡三三数之剩一,则置七十,五五数
之剩一,则置二十一,七七数之剩一,则置十五,即得.” –外甥算经

设n组数(ai, bi),
个中bi两两互素

求x使得 x = a1 mod b1 x = a2 mod b2 …
x = an mod bn

给定两两互质的正整数n1,n2,…,nk,必要找到最小的正整
数x,满意方程组x≡ai(mod ni) (i=1,2…k)

算法步骤: 令n=n1n2…nk,
mi=n/ni 

显然gcd(mi,ni)=1,

采用扩大欧几Reade算法总计出xi满意mixi≡1(mod ni)

x = (a1x1m1+a2x2m2+…+akxkmk) mod

此方程组任意三个解模 n
同余,由此x就是细微的

此方程组任意多少个解模 n 同余
证:设有七个解 x1,x0 则: x1 ≡ ai (mod ni) (i=1,2…k) x0 ≡ ai (mod ni)
(i=1,2…k) => ni|(x1-x0) (i=1,2…k) ni|(x1-x0) 且ni两两互质 =>
n|(x1-x0) => x1 ≡ x0 (mod n)

神州剩余定理的一般情况

给定正整数n1,n2,…,nk(未必两两互质),供给找到x,

满 足x≡ai(mod ni)
(i=1,2…k)

x ≡ a1( mod
n1)

x ≡ a2( mod
n2)

=> x + u*n1 = a1
且 x – v*n2 = a2

=> n1*u + n2*v =
(a1-a2) 此关于u,v的方程,当且仅当 gcd(n1,n2)|(a1-a2)时有解

设用扩大欧几里得算法求得
n1*u + n2*v = (a1-a2) 根为 (u0,v0)则:

则此方程解集为: u =
u0 + t*(n2/gcd(n1,n2)) v = v0 – t*(n1/gcd(n1,n2)) t为随意整数

x + u*n1 = a1 =>
x的解集为:a1 – u0n1 – tn1n2/gcd(n1,n2) 即:x = a1 – u0n1 –
t*lcm(n1,n2) t为专擅整数

x = a1 – u0n1 –
t*lcm(n1,n2) t为随意整数

等价于将

x ≡ a1( mod n1)

x ≡ a2( mod n2)

集合为: x ≡ a1 – u0n1
(mod lcm(n1,n2)) 再持续三个方程并为多少个,最终就能求得x的解空间

 

线性筛法求素数

朴素筛法求n以内的富有质数

伊始时容器内为2到n的全部数

取出最小的数p,p一定是质数,删去除p外的全部p的倍数

再次上述手续直到向后找不到没被删掉的数

缺点:1个数或许被重复删去多次,影响成效

修正: 对各类素数p
考虑全数i,

若i的最小素因子>=p,

则将 i*p去掉 i = q1
*q2 *…qn qi是素数,

q1 >= p i*p = p*q1
*q2 *…qn i*p只会被删掉3回,只在考察p的时候被删,不会在旁观q1 q2 qn
的时候被删

图片 19图片 20

int main()
{
    int n;
    cin >> n; //求n以内素数
    vector<int> prime;
    vector<bool> isPrime(n+1);
    for(int i = 1; i <= n; ++i)
        isPrime[i] = true;
    for(int i = 2; i <= n; ++i)
    {
        if( isPrime[i]) //处理到i时它还没被删掉,则i为素数
            prime.push_back(i);
        for(int j = 0; j < prime.size() ; ++j)
        {
            if( i*prime[j] <= n)
                isPrime[i*prime[j]] = false;
            else break;
            if( i % prime[j] == 0)// prime[j]是i的最小素因子
                break;
        }
    }
    for(int i = 0; i < prime.size(); ++i)
        cout << prime[i] << endl;
    return 0;
}

线性筛