数论板子大总结

在这里,将有迄今为止学过的所有数论。

1、素数筛——埃拉托斯特尼筛法

时间复杂度:O(nloglogn)

方法:用每个素数筛所有它的倍数

证明:略

    for (int i=2;i<=N;i++) is[i]=1;
    for (int i=2;i<=N;i++)
    if (is[i])
        for (int j=i*i;j<=2000;j+=i)
        is[j]=0;

2、素数筛——欧拉筛法

时间复杂度:O(n)

方法&证明:埃拉托斯特尼对于每个合数筛了很多遍,而欧拉对于每个合数只被自己的最小质因数所筛去

    memset(is,1,sizeof(is));
    for (int i=2;i<=100000;i++)
    {
    if (is[i]) prime[++cnt]=i;
    for (int j=1;j<=cnt && i*prime[j]<=100000;j++)
    {
        is[i*prime[j]]=0;
        if (i%prime[j]==0) break;
    }
    }

3、欧拉函数

求[2,n)中与n互质的数的个数

//欧拉函数记做$\Phi(n)$

性质:

$\Phi(n)=\Phi(P_1^{a_1})\Phi(P_2^{a_2})\Phi(P_3^{a_3})…\Phi(P_s^{a_s})$

P为n的质因数,在n中a为其质因数的幂

定理:

(1)如果p是素数,那么$\Phi(p)=p-1$ (逆定理成立)

(2)如果p是素数,那么$\Phi(p^a)=p^a-p^{a-1}$

(3)设n和m互质,$\Phi(nm)=\Phi(n)\Phi(m)$

(4)p为n的质因数,a为对应指数,$\Phi(n)=n(1-1/p_1)(1-1/p_2)(1-1/p_3)…(1-1/p_s)$

推论:当n为奇数时,$\Phi(2n)=\Phi(n)$

(5)设n>2,那么$\Phi(n)$是偶数

(6)设n为正整数,$\sum_{d|n} \phi(d) = n$

//求一个数的欧拉函数
ll phi(ll x)
{
    ll ans=x,c=x;
    for (int i=2;i<=c/i;i++)
    {
    if (c%i==0) ans=ans/i*(i-1);
    while(c%i==0) c/=i;
    }
    if (c>1) ans=ans/c*(c-1);
    return ans;
}
//求[1,n]的欧拉函数
void euler(ll n)
{
    ll cnt=0;
    memset(is,1,sizeof(is));
    is[1]=0;
    for (ll i=2;i<=n;i++)
    {
    if (is[i]) prime[++cnt]=i,phi[i]=i-1;
    for (int j=1;j<=cnt && prime[j]*i<=n;j++)
    {
        is[prime[j]*i]=0;
        if (i%prime[j]==0)
        {
        phi[i*prime[j]]=phi[i]*prime[j];
        break;
        }
        phi[i*prime[j]]=phi[i]*(prime[j]-1);
    }
    }
}

4、欧拉定理&费马小定理&乘法逆元

欧拉定理:对于任何两个互质的正整数a和m(m>1),有$a^{\Phi(m)}\equiv1(mod m)$

费马小定理:当m是质数时,$a^{m-1}\equiv1(mod m)$

5、欧几里得算法

//求a和b的最大公因数,记做gcd(a,b)

//(最小公倍数记做lcm(a,b),显然lcm(a,b)=a*b/gcd(a,b))

又名辗转相除法

原理:gcd(a,b)=gcd(b,a%b)

(详情请参见更相减损术)

6、扩展欧几里得算法

求解ax+by=gca(a,b)的x和y

显然这是一个不定方程,所以有多组解,而ex_gcd可以得出其中一组解,然后我们可以通过转换求出所有解

证明:

因为$ax+by=1$ $→$ $ax+by+ab-ab=1$ $→$ $a(x+b)+b(y+a)=1$

所以在求出一个可行解x之后,不断的把x+-b仍是该方程的一个解,利用这个性质可以求类似最小解的问题

void ex_gcd(ll a,ll b,ll &x,ll &y)
{
    if (!b)
    {
    x=1;
    y=0;
    return ;
    }
    ex_gcd(b,a%b,y,x);
    y-=a/b*x;
}

7、中国剩余定理

emm…证明太繁琐,附上百度百科的网址把

qwq

int CRT(int a[],int m[],int n)
{
    int M=1;
    int ans=0;
    for (int i=1;i<=n;i++)
    M*=m[i];
    for (int i=1;i<=n;i++)
    {
    int x,y;
    int Mi=M/m[i];
    exgcd(Mi,m[i],x,y);
    ans=(ans+Mi*x*a[i])%M;
    }
    if (ans<0) ans+=M;
    return ans;
}
时间: 2024-10-09 20:43:42

数论板子大总结的相关文章

数论板子

数论板子 数论分块 : j = n / (n / i); ans += (n/i) * (j - i + 1); 筛法: 线性筛: #include<cstring> #incldue<cmath> const int MAXN=1000010; bool prime[MAXN]; int Prime[MAXN]; int num=0; void make_prime() { memset(prime,true,sizeof(prime)); prime[0]=prime[1]=f

Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)

哎呀大水题..我写了一个多小时..好没救啊.. 数论板子X合一? 注意: 本文中变量名称区分大小写. 题意: 给一个\(n\)阶递推序列\(f_k=\prod^{n}_{i=1} f_{k-i}b_i\mod P\)其中\(P=998244353\), 输入\(b_1,b_2,...,b_n\)以及已知\(f_1,f_2,...,f_{n-1}=1\), 再给定一个数\(m\)和第\(m\)项的值\(f_m\), 求出一个合法的\(f_n\)值使得按照这个值递推出来的序列满足第\(m\)项的值为

BZOJ1951 [Sdoi2010]古代猪文

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ1951 正解:中国剩余定理+费马小定理+$Lucas$定理 解题报告: 这道题可以说是数论+组合大综合题- 题目求的是$\sum_{d|n} g^{C_n^d}$,模数$p$是质数(特判$g=p!$),根据费马小定理,我们可以把幂上的数

UVa 474 - Heads / Tails Probability

题目:计算1/(2^n)的值的前4为有效数字以及位数. 分析:数论,大整数.直接用数组模拟即可. 说明:打表计算,查询输出. #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std; double val[1000005]; int bit[1000005]; int main() { val[0] = 1;bit[0] = 0

UVa 10551 - Basic Remains

题目:给你两个b进制数p,m,求p mod m的余数的b进制表示. 分析:数论,大整数.可以转成10进制在转回去,这里直接处理b进制. 处理过程和10进制相同,移位减法即可(借位是+b). 说明:写的有点复杂╮(╯▽╰)╭. #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> typedef struct _bn { int length; int data[111

走进基础数学—一位学霸的心路历程

作者 | 何通木 来源 | 知乎 大家好,我是来自清华大学数学系的准大四学生何通木.学了三年现代数学,我想把自己的一些感悟记录下来.回头看这三年,觉得走了很多弯路.做了很多意义不大的事情,想来是跟学长.老师们的深层次沟通少了,所以想用剖析自己的经历.优缺点的方式,向大家展示一个天分普通的学生的本科学习历程,希望后来人能够更好地利用这三年时间. 对于不想从头看到尾的同学,可以根据目录挑选想看的部分,也可以只看第八节:修习顺序建议.以下观点仅为个人观点,欢迎大家讨论! 目录 一.指导思想 二.最基本

Noip前的大抱佛脚----数论

数论 知识点 Exgcd \(O(logn)\)求解\(Ax+By=C\)的问题 1.若\(C\%gcd(A,B)!=0\)则无解 2.\(Gcd=gcd(A,B);A/=Gcd,B/=Gcd,C/=Gcd\) 3.代入下面代码求\(Ax+By=1\) 4.\(x*C\),得到一组特解 5.通解为\(\begin{cases}x=x_0+k*B \\y=y_0+k*A\end{cases}\) void Exgcd(ll a,ll b,ll &x,ll &y) { if(!b){x=1;y

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

POJ 1181 大整数是否为素数以及求大整数的质因数-数论-(Miller_rabin+Pollard_rho)

题意:求一个整数是否是素数,如果不是,则输出它最小的质因数. 分析: 判断一个大整数是否为素数用Miller_rabin算法,求一个大整数的所有质因数用Pollard_rho算法.这题就是直接套模板. 另外这里的gcd和pow_mod不能用一般的方式,T了.代码里我注释掉的就是T了的写法. 代码: #include<iostream> #include<cmath> #include<ctime> #include<cstdio> #include<a