1. 程式人生 > 實用技巧 >數論專題(持續更新)

數論專題(持續更新)

數論好難啊QAQ

----------------------------------------------------------------------------------

先來一些基本的數論必備程式碼

(1)尤拉篩

const int MAXN=3000001;
int prime[MAXN];//儲存已經求出的素數
bool vis[MAXN];//判斷是不是素數
int Prime(int n)
{
    int cnt=0;
    memset(vis,0,sizeof(vis)); //vis[]=0指是素數
    for(int i=2;i<n;i++)
    {
        if
(!vis[i]) prime[cnt++]=i; for(int j=0;j<cnt&&i*prime[j]<n;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0)//尤拉篩法的精髓之處,目的是為了不重複篩除資料 break; } } return cnt;//返回小於n的素數的個數 }

具體的之前部落格有寫:https://www.cnblogs.com/Knightero/p/12778655.html

(2)gcd與lcm

int gcd( int  a,int b)
{ return b==0?a:gcd(b,a%b); }
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}

(3)快速冪

int quick_pow(int x,int n,int mod){
    int res = 1;
    while(n > 0){
        if(n & 1)    res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return
res; }

------------------------------------------------------------------------------------------

新學習到的知識

(1)求逆元

運用費馬小定理求逆元(其實不難)

(a/b)%mod不等於(a%mod/b%mod)%mod;

但是a/b可以看成a*b^-1

把除法轉換為乘法來運算

逆元就是研究怎麼已知b算出b^-1(且要有%mod,不然直接除就好了)

這時候出現了費馬小定理

所以要計算(a/b)%mod=(a*b^-1)%mod=(a*b^(p-2))%mod

而此刻我們會求b^(p-2),利用快速冪可求

long long int quick_pow(long long int a, long long int b)
{

    long long int ans = 1;
    while (b) {
        if (b & 1) ans = (ans * a) % mod;
        b >>= 1;
        a = (a * a) % mod;
    }
    return ans;
}
long long int inv(long long int a, long long int b)//求(a/b)%mod
{
    return a * quick_pow(b, mod - 2) % mod;
}