码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-30 00:26:22      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

扩展欧几里得

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

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

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

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

技术分享,

整理得 技术分享

所以技术分享

就可以在求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;
}

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

标签:

原文地址:http://www.cnblogs.com/AireenYe/p/5820154.html

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