码迷,mamicode.com
首页 > 编程语言 > 详细

算法笔记--数论模板小集(待增)

时间:2017-07-14 23:58:51      阅读:389      评论:0      收藏:0      [点我收藏+]

标签:lin   blank   not   ++   code   oid   快速   div   span   

仓鼠大神博客:http://www.cnblogs.com/linyujun/p/5194184.html

       http://www.cnblogs.com/linyujun/p/5194170.html

①gcd

一行版:

  

unsigned int gcd(unsigned int a,unsigned int b)
{
    return b>0?gcd(b,a%b):a; 
}

位运算版:

ll gcd(ll a,ll b)  
{  
    while(b^=a^=b^=a%=b);  
    return a;  
}

②快速幂和快速乘

ll pow(ll n,ll k)
{
    ll ans=1;
    while(k)
    {
        if(k%2) ans*=n;
        n*=n;
        k/=2;
    }
    return ans;
}
ll mul(ll n,ll k)
{
    int ans=0;
    while(k)
    {
        if(k%2) ans+=n;
        n+=n;//n*=2;
        k/=2;
    }
    return ans;
}

③扩展欧几里得(扩展gcd)

int e_gcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    int ans=e_gcd(b,a%b,x,y);
    int temp=x;
    x=y;
    y=temp-a/b*y;
    return ans;
}
int e_gcd(int a,int b,int &x,int &y){
    if (!b)
    {
        x=1,y=0;
        return a;
    }
    int ans=e_gcd(b,a%b,y,x);//注意x,y位置和上面不同
    y-=a/b*x;
    return ans;
}

④乘法逆元


扩展欧几里得版:

ll e_gcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    ll ans=e_gcd(b,a%b,x,y);
    ll temp=x;
    x=y;
    y=temp-a/b*y;
    return ans;
}
ll inv(ll a,ll n)
{
    ll x,y,d=e_gcd(a,n,x,y);
    if(d==1)return (x%n+n)%n;
    else return -1;
}

费马小定理版:

LL pow_mod(LL a, LL b, LL p){//a的b次方求余p 
     LL ret = 1;
     while(b){
         if(b & 1) ret = (ret * a) % p;
         a = (a * a) % p;
         b >>= 1;
     }
     return ret;
}
LL Fermat(LL a, LL p){//费马求a关于b的逆元 
         return pow_mod(a, p-2, p);
 }

⑤素数筛

void prime(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!not_prime[i])
        {
            for(int j=i+i;j<=n;j+=i)
            not_prime[j]=true;
        }
    }
}

⑥欧拉筛

phi(n)表示小于等于n与n互质数的个数

void Euler(){
    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);
            }
        }
    }
}

未完待续。。。

 

算法笔记--数论模板小集(待增)

标签:lin   blank   not   ++   code   oid   快速   div   span   

原文地址:http://www.cnblogs.com/widsom/p/7173095.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!