OI 数论模板总结

news/2024/11/16 23:31:00/

1.欧几里得算法

可以通过欧几里得算法求出最大公因子。

int gcd(int x, int y) //欧几里得算法 
{ return y==0 ?  x : gcd(y, x%y);
}

2.扩展欧几里得

可以通过扩展欧几里得求出 a x + b y = d ax+by=d ax+by=d
不定方程的一组整数解。( a , b , d a, b, d a,b,d为正整数)

void exgcd(int a, int b, int& x, int& y) //扩展欧几里得 
{if(!b){x=1; y=0;return ;}exgcd(b, a%b, y, x);y-=(a/b)*x; 
}

3.快速幂

可以通过快速幂在 O ( l o g n ) O(logn) O(logn)
的复杂度下求出 x y mod  p xy \ \text{mod} \ p xy mod p


LL ksm(LL x, LL y, int p) //快速幂 
{LL ans=1;while(y){if(y&1) ans=(ans*x)%p;y>>=1; x=(x*x)%p;}return ans%p;
}

4.质因数分解

可以求出一个整数的所有质因数(没有去重)

void factor(int num) //质因数分解 
{int fac[MAXN],cnt;while(num!=1)for(int i=2; i<=num; i++) if(num%i==0){fac[++cnt]=i;num/=i; i=1;}for(int i=1; i<=cnt; i++) printf("%d ",fac[i]);
}

5.费马小定理求组合数

可以求 C m n m o d p C_m^n \mod p Cmnmodp,其中需要 n , m n,m n,m较小,较大时要用卢卡斯定理优化。

LL combine(LL x, LL y)   //费马小定理求组合数 
{  LL up=1, down=1;  for(LL i=0; i<y; i++){  up=up*(x-i)%p;  down=down*(i+1)%p;  }  return up*ksm(down, p-2, p)%p;  //可以直接使用上文给出的ksm()
}  

6.卢卡斯定理求组合数

同样可以求 C m n m o d p C_m^n \mod p Cmnmodp,其中 p < = 1 0 5 , n , m < = 1 0 18 p<=10^5 ,n,m<=10^{18} p<=105n,m<=1018

LL lucas(LL x, LL y) //卢卡斯定理求组合数 
{  if(!y) return 1;  return combine(x%p, y%p)*lucas(x/p, y/p)%p;  //可以直接使用上文给出的combine()
}  

7.中国剩余定理
可以求解一元线性同余方程组。

LL china(int n, int *a, int *m) //中国剩余定理 
{LL p=1, ret=0, x, y;for(int i=1; i<=n; i ++) p*=m[i];for(int i=1; i<=n; i ++){LL w=p/m[i];exgcd(m[i], w, x, y); //可以直接使用上文的exgcd()ret=(ret+w*y*a[i])%p;}return (ret+p)%p;
}

8.线性素数筛
可以求出 1 → n u m 1 \to num 1num 内所有的素数。

void prime(int num) //素数筛 
{int cnt=0, check[MAXN], pri[MAXN];sizeof(check, true, sizeof(check));check[1]=false;for(int i=2; i<=num; i++){if(check[i]) pri[++cnt]=i;for(int j=0; j<cnt && i*pri[j]<=num; j++){check[i*pri[j]]=false;if(i%pri[j]==0) break;}}
} 

9.欧拉函数筛
可以求出 1 → n u m 1 \to num 1num 内的欧拉函数。

void euler(int num) //欧拉函数筛 
{     int cnt=0, check[MAXN], eul[MAXN], pri[MAXN];sizeof(check, true, sizeof(check));  check[1]=false; eul[1]=1;  for(int i=2; i<=num; i++){if(check[i]){pri[++cnt]=i;eul[i]=i-1;}for(int j=0; j<cnt && i*pri[j]<=num; j++){check[i*pri[j]]=false;if(i%pri[j]==0){eul[i*pri[j]]=eul[i]*pri[j];break;}eul[i*pri[j]]=eul[i]*(pri[j]-1);}}      
}

10.莫比乌斯函数筛

可以求出 1 → n u m 1 \to num 1num 内的莫比乌斯函数

void mobius(int num) //莫比乌斯函数筛 
{int cnt=0, check[MAXN], mob[MAXN], pri[MAXN];sizeof(check, true, sizeof(check));check[1]=false; mob[1]=1;  for(int i=2; i<=num; i++){if(check[i]){pri[++cnt]=i;mob[i]=-1;}for(int j=0; j<cnt && i*pri[j]<=num; j++){check[i*pri[j]]=false;if(i%pri[j]==0){mob[i*pri[j]]=0;break;}mob[i*pri[j]]=-mob[i];}}  
}

http://www.ppmy.cn/news/60650.html

相关文章

【热门框架】Mybatis-Plus入门介绍看这一篇文章就足够了

MyBatis-Plus 是在 MyBatis 的基础上进行了封装&#xff0c;提供了更加便捷的开发方式&#xff0c;具有简化开发、提高效率等优点。以下是 MyBatis-Plus 的一些特点和用法&#xff1a; 通用 CRUD 操作&#xff1a;MyBatis-Plus 提供了通用的 CRUD 接口&#xff0c;可以直接调用…

TinyJAMBU的制动原理——一种轻量化的认证密码

关于TinyJAMBU的定义和介绍在另一篇博文已经介绍过了&#xff0c;这里只对其动作原理进行描述和说明。 对应的博文链接如下&#xff1a;TinyJAMBU&#xff1a;一种轻量化密码介绍 首先&#xff0c;该密码是一个流密码体系的块密码框架。其加密模式整体上来看是块密码&#xff0…

Python 扩展教程(1): 调用百度AI

关于AI 自有计算机以来&#xff0c;人们就想让计算机具有人的感知、意识、概念、思维、行为&#xff0c;代替人的工作。AI (Artificial Interligence)是计算机科学的一个分支&#xff0c;专注研究、开发、模拟、扩展人的智能的理论、方法、技术及应用。 从研究领域和方法上&…

当音乐遇上Python:用Pydub自动分割音频

&#x1f3b5; &#x1f3b5; &#x1f3b5; 当音乐遇上Python&#xff1a;用Pydub自动分割音频 随着短视频应用的普及&#xff0c;越来越多人开始了解并尝试制作自己的短视频作品。而在制作短视频时&#xff0c;背景音乐的选择和使用也是非常重要的一步。很多人喜欢选择一首长…

JAVA编程语言中的关键字有哪些?

JAVA编程语言中有关键字&#xff0c;它们在编程中有着特定的含义和用途。下面是这些关键字的详细介绍&#xff1a; abstract: 抽象类或抽象方法的修饰符&#xff0c;用于表示方法或类是抽象的&#xff0c;不能被直接实例化。 assert: 断言关键字&#xff0c;用于在代码中进行条…

node笔记_http服务搭建(渲染html、json)

文章目录 ⭐前言⭐初始化项目调整npm 的script运行入口搭建hello world的http服务npm run dev执行主函数的http服务 ⭐http返回类型html模板文件返回安装express渲染html的字符串 渲染html文件 sendFile渲染json返回数据类型 res.json ⭐结束 ⭐前言 大家好&#xff0c;我是ym…

Vue快速入门,常用指令,生命周期

Vue常用指令 案例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

jQuery引入----练习

jQuery引入----练习 html <!DOCTYPE html> <html><head><title>jQuery引入</title><!-- css样式引入 --><link rel"stylesheet" href"../css/a.css"><!-- jquery函数库引入 --><script type"tex…