[蒟蒻修炼计划][学习笔记]数论

Posted Aireen Ye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[蒟蒻修炼计划][学习笔记]数论相关的知识,希望对你有一定的参考价值。

扩展欧几里得

求二元一次不定方程技术分享的一组解。

技术分享时,有一组解 技术分享

技术分享时,因为 技术分享

所以设技术分享满足技术分享,

技术分享,

整理得 技术分享

所以技术分享

就可以在求gcd的过程中得到一组解。

inline int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1;y=0;return a;
    }
    else{
        int ret=exgcd(b,a%b,y,x);
        y-=a/b*x;return ret;
    }
}

欧拉函数

欧拉函数技术分享的定义:小于等于技术分享的正整数中与技术分享互质的数的个数。

技术分享时,技术分享

技术分享时,技术分享可以写成技术分享个素数的幂的积的形式,第技术分享个素数的质数为技术分享:

技术分享

根据容斥原理得,技术分享

简单地推一下后发现,技术分享

BSGS

求最小的技术分享使得技术分享为质数。

技术分享,则技术分享,即技术分享

将所有的技术分享技术分享存起来,从小到大枚举技术分享,直到技术分享是某个技术分享

此时答案为技术分享

技术分享由费马小定理可得,技术分享,所以 技术分享,

   所以可以用快速幂实现除法(技术分享时会有技术分享)。

typedef long long ll; 
map<ll,ll> m;
inline ll po(ll x,ll k,ll p){
    ll ret=1;
    while(k){
        if(k&1) ret=ret*x%p;
        x=x*x%p;k>>=1;
    }
    return ret;
}
inline ll bsgs(ll a,ll b,ll p){
    if(gcd(a,p)!=1) return -1;
    ll s=sqrt(p),k=1,x=1,y;
    while(s*s<=p) ++s;
    for(ll i=0;i<s;++i){
        if(!m[k]) m[k]=i;
        k=k*a%p;
    }
    for(ll i=0;i<s;++i){
        y=b*po(x,p-2,p)%p;
        if(m.count(y))
            return i*s+m[y];
        x=x*k%p;
    }
    return -1;
}

以上是关于[蒟蒻修炼计划][学习笔记]数论的主要内容,如果未能解决你的问题,请参考以下文章

蒟蒻修炼计划-KMP 模板

[蒟蒻修炼计划][模板] 2-SAT

蒟蒻AJY的学习计划

[蒟蒻修炼计划][bzoj3670][Noi2014]动物园

[蒟蒻修炼计划][cf621E]Wet Shark and Blocks

学习笔记--数论--莫比乌斯反演初认识