聊聊学习数论的心情

这两天对数论的学习,讲真,有一点小难受,哈哈,遇到了一点小障碍。不过看了看旁边在拼命撸数据结构的队友,心情还是好了很多,特别是在看了两天线段树之后。

反正抱队友大腿嘛,哈哈哈。

这两天学习数论,感觉基础的数论大概就是分为唯一分解定理,素数,取模还有欧几里得。

   素数

素数的话,主要是/。。。。打表。。。花式打表,刷专题的时候感觉各种建立在埃式筛上面的打表,一次又一次的让我目瞪口呆,我的老天,这样都行。。。再一次感慨,搞acm像我这种智商不够的同学,果然还是只能靠队友。。。。

关于埃式筛

bool isprime[N];
int prime[M],a[M],cnt = 0;
void getprime()
{
    memset(isprime,true,sizeof isprime);
    isprime[0] = isprime[1] = false;
    for(int i = 1;i < N;++i){
        if(isprime[i]){
            prime[++cnt] = i;
            for(int j = 2 * i;j < N;j += i)
                isprime[j] = false;
        }
    }
}

由于在筛选素数的时候,把所有范围内数字都过了一次,可以介于此,花式打表。

比如记录该个位置素数的个数。。

埃式筛也是一种相当优化的筛选素数的算法。(虽然有O(n)的筛选方法,但是一般1e7以内,埃式筛的算法就ok了)。

唯一分解定理


一般来讲唯一分解定理,。。。应该说唯一分解定理就是和素数同时出现的,对于任何一个大于2的数字。。。

p=x1^e1*x2^e2*x3^e3...*xk^ek(x为素数)。

int only(int n)
{
    int res = 0;
    for(int i = 1;i <= cnt && prime[i] * prime[i] <= n;++i)
        if(n % prime[i] == 0){
            res++;
            while(n % prime[i] == 0){
                n /= prime[i];
                res++;
            }
        }
    return res;
}

这个函数是专门算素数的指数和。。

取模

取模一般是和快速幂联合起来的,还有逆元。

快速幂取模就比较简单了,就直接上代码。

long long fpow(long long a, long long b)
{
    long long res;
    while(b){
        if(b & 1)   res = (res * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}

然后就是除法的取模,首先要找逆元,找分母的逆元,然后分子乘分母的逆元再取模。

为什么要使用逆元呢,精度问题,当分母很大时,直接计算,但是直接使用除法在c语言的编译中就成了整除,而取模运算在整数部分才等价于求余运算。在分数部分应该在于取出用于计算的模。

逆元的求法:

费马小定理版:

int inverse(int n)
{
    return fpow(n,mod - 2);
}

扩展欧几里得版:

int inverse_gcd(int n)
{
    int x,y;
    gcd_plus(n,mod,x,y);
    x = (x % mod + mod) % mod;
    return x;
}

欧几里得

这个就直接上三件套好了

int gcd(int a,int b)
{
    return b ? gcd(b,a % b) : 0;
}
int lcm(int a,int b)
{
    return a / gcd(a,b) * b;
}
int gcd_plus(int a,int b,int &x,int &y)
{
    if(!b){
        x = 1;y = 0;
        return a;
    }
    else{
        int ans = gcd_plus(b,a % b,y,x);
        y -= (a / b) * x;
        return ans;
    }
}
感觉数论的题目,一般就是往这几个方面去套,具体怎么推,纯看运气。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值