数论模板笔记打卡

1、快速幂

LL quick_mi(LL l,LL r)
{
    LL res = 1;
    while(r)
    {
        if(r&1)
            res = res * l%N;
        l = l*l%N;
        r >>=1;
    }
    return res;
}

2、求每个数是多少个其他的数的约数

    for(int i = 1;i

3、筛素数(1-n)中有多少素数

void init(int n)
{
    for(int i = 2;i<=n;i++)
    {
        if(!st[i])
            primes[cnt++] = i;
        
        for(int j = 0;i*primes[j]<=n;j++)
        {
            st[i*primes[j]] = true;
            if(i%primes[j]==0)break;
            
        }
    }
}

4、求一个数的约数个数有多少。

根据公式

N = p_{1}^{c1}*p_{2}^{c2}*p_{3}^{c3}.....p_{n}^{cn}

则约数个数为:\left ( c1+1 \right )*(c2+1)*(c3+1)......*(cn+1) 

void init(int n)
{
    for(int i = 2;i<=n;i++)
    {
        if(!st[i])
            primes[cnt++] = i;
        
        for(int j = 0;i*primes[j]<=n;j++)
        {
            st[i*primes[j]] = true;
            if(i%primes[j]==0)break;
            
        }
    }
}

// 筛完后求每个素数对应的指数

for(int i = 0;i

5、求欧拉函数

定义:给定正整数N,求它的欧拉函数,也就是说1-N中有几个与它互质记为\phi\left ( N\right )

由算数基本定理可得:N=p_{1}^{a1}*p_{2}^{a2}......*p_{k}^{ak}

\phi(N) = N*\frac{p1-1}{p1}*\frac{p2-1}{p2}*....*\frac{pk-1}{pk} 

 代码如下:

#include
#include
using namespace std;
typedef long long LL;
int main()
{
    int n;
    cin>>n;
    
   for(int i = 0;i>t;
       int res = t;
       for(int i = 2;i<=t/i;i++)
       {
           if(t%i==0)
           {
               res = res /i*(i-1);
               while(t%i==0)t/=i;
           }
       }
       
       if(t>1) res = res/t*(t-1);
       cout<

 6、筛求法求欧拉函数

所谓筛求法,就是像筛素数一样,直接一次性求出很多数字的欧拉函数

有:\phi(i*p_{j})

若:i mod p_{j}==0,\phi(i*p_{j}) = p_{j}*\phi(i)

若:imodp_{j}\neq 0,\phi(i*p_{j}) = \phi(p_{j})*\phi(i) 

细细理解就能体会,代码如下:

LL get_ouer(int n)
{
    phi[1] = 1;
    for(int i = 2;i<=n;i++)
    {
        if(!st[i])
        {
            primes[cnt++] = i;
            phi[i] = i-1;    
        }
        for(int j = 0;i*primes[j]<=n;j++)
        {
            st[i*primes[j]] = true;

            if(i%primes[j]==0)
            {
                phi[i*primes[j]] = primes[j]*phi[i];
                break;
            }
            phi[i*primes[j]] = (primes[j]-1) * phi[i];
        }
    }
    
    LL res = 0;
    for(int i = 1;i<=n;i++)
    {
        res += phi[i];
    }
    return res;
}

你可能感兴趣的:(数论,笔记)