数论问题代码模板

文章目录

    • 一、质数
      • 1.1、质数筛(筛1~n中的所有质数)
      • 1.2、判断一个数是否为质数
      • 1.3、对一个数进行质因数分解
    • 二、快速幂
      • 2.1、费马小定理——乘法逆元
      • 2.2、快速幂
    • 三、约数
      • 3.1、N个数的正约数集合
      • 3.2、一个数的正约数集合
    • 四、欧拉函数(互质数数目)
    • 五、最大公约数
      • 5.1、__gcd(a,b)
      • 5.2、欧几里得算法
      • 5.3、扩展欧几里得
    • 六、组合数
      • 6.1、递推法求组合数(可以求出以0~n为底的所有组合数)
      • 6.2、通过预处理逆元的方式求组合数(C(n,k)%p)
    • 七、卡特兰数
    • 八、第二类斯特林数

一、质数

1.1、质数筛(筛1~n中的所有质数)

时间复杂度:O(n)

//N是要筛的质数范围,prime存储质数
#include<vector>
void Prime_sieve(int N,vector<int> & prime){
	vector<int> notp(N+1);
	notp[1]=1;//初始化为0,因此默认一个数是质数,不是质数用1标记
	for(int i=2;i<N;++i){
    	if(!notp[i]) prime.push_back(i);
	//如果一个数没被标记,其一定是质数,不是质数的一定被其最小质因数标记了。
    	for(int j=0;j<prime.size();++j){
        	if(i * prime[j]>N) break;//范围超限,之后都超限,直接不管了
        	notp[i*prime[j]]=1;//这个数一定不是质数
        	if(i % prime[j]==0) break;//prime[j]是i的最小质因数! 退出咯
    	}
	}
	return;
}

1.2、判断一个数是否为质数

时间复杂度:O( ( n ) \sqrt(n) ( n))

//num是需要判断是质数,函数返回为true则为质数
#include<cmath>
bool Is_prime(int num){
    if(num==1) return false;
    if(num==2||num==3) return true;
    if(num%6!=1&&num%6!=5) return false;
    if(num%2==0||num%3==0) return false;
    int j=sqrt(num);
    for(int i=5;i<=j;i+=6){
        if(num%i==0||num%(i+2)==0){
            return false;
        }
    }
    return true;
}

1.3、对一个数进行质因数分解

时间复杂度:O( ( n ) \sqrt(n) ( n))

//N是要进行分解的数,factor存储分解结果,nums存每个质因数的次数
#include<vector>
void prime_factorization(int N,vector<int> & factor,vector<int> & nums){
	for(int i=2;i*i<=N;++i){
    	if(N%i==0){
        	factor.push_back(i);
        	nums.push_back(0);
        	while(N%i==0) {nums[nums.size()-1]++;N/=i;}
    	}
	}
	if(N>1)  {factor.push_back(N);nums.push_back(1);}
	return;
}

二、快速幂

2.1、费马小定理——乘法逆元

时间复杂度:O( ( p ) \sqrt(p) ( p))

//n^(p-1)≡1 (mod p)  n的乘法逆元是n^(p-2)
long long inverse_element(long long n,long long p){
    long long x=1;
    long long p=1e9+7;  
    long long b=p-2;
    while(b){
        if(b&1) x=(x*n)%p;
        n=(n*n)%p;
        b>>=1;
    }
    return x;//x是n的乘法逆元
}

2.2、快速幂

时间复杂度:O( ( n ) \sqrt(n) ( n))

//求n^b,答案是x
#include <limits>
long long fast_pow(long long n,long long b){
	long long x=1;
    long long p=std::numeric_limits<long long>::max();
    while(b){
        if(b&1) x=(x*n)%p;
        n=(n*n)%p;
        b>>=1;
    }
    return x;
}

三、约数

3.1、N个数的正约数集合

时间复杂度:O(NlogN)

//求1~N所有数的正约数集合
#include<vector>
void N_Set_of_positive_divisors(int N,vector<vector<int> >& factor){
	factor.assign(N,vector<int>{});
	for(int d=1;d<=N;++d)
    	for(int i=1;i<=N/d;++i){
        	factor[d*i].push_back(d);
    }
    return;
}

3.2、一个数的正约数集合

时间复杂度:O( ( n ) \sqrt(n) ( n))

#include<cmath>
#include<vector>
void Set_of_positive_divisors(int num,vector<int> & factor){
    float j=sqrt(num);
    for(int i=1;i<j;++i){
        if(num%i==0){//我们限制i在根号N的取地板之下,必然保证了成对出现
            factor.push_back(i);
            factor.push_back(num/i);
        }
    }
    if(int(j)*int(j)==num) factor.push_back(j);
    return 0;
}

四、欧拉函数(互质数数目)

时间复杂度:O( ( n ) \sqrt(n) ( n))

//求n的欧拉函数
int Set_of_prime(int n){
    int ans=n;
    for(int i=2;i*i<=n;++i){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0){
                n/=i;
            }
        }
    }
    if(n>1) ans=ans/n*(n-1); 
    return ans;
}

五、最大公约数

5.1、__gcd(a,b)

时间复杂度:O(log min(a, b))

//c++,GCC提供的一个非标准扩展,因此在非GNU编译器中可能不可用。
#include<algorithm>
int gcd(int a, int b){
    return __gdc(a,b);
}

5.2、欧几里得算法

时间复杂度:O(log min(a, b))

int gcd(int a, int b){
    return b ? gcd(b, a % b) : a;
}

5.3、扩展欧几里得

它不仅能计算出两个整数a和b的最大公约数,还能找到整数x和y(其中x和y可能为正数或负数),使得它们满足贝祖等式
[ ax + by = gcd(a, b) ]

// 求x, y,使得ax + by = gcd(a, b),并返回gcd(a,b) 这里是d
int exgcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1; y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= (a/b) * x;
    return d;
}

以下借鉴:常用代码模板4

六、组合数

6.1、递推法求组合数(可以求出以0~n为底的所有组合数)

时间复杂度:O( n 2 n^{2} n2)

// c[n][m] 表示从n个苹果中选m个的方案数
for (int i = 0; i < N; i ++ )
    for (int j = 0; j <= i; j ++ )
        if (!j) c[i][j] = 1;
        else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;

6.2、通过预处理逆元的方式求组合数(C(n,k)%p)

预处理时间复杂度:O(n)
每次组合数求解时间复杂度:O(1)

int qmi(int a, int k, int p)    // 快速幂模板
{
    int res = 1;
    while (k)
    {
        if (k & 1) res = (LL)res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}
// 预处理阶乘的余数和阶乘逆元的余数
vector<int> fact(max_len,0);
vector<int> infact(max_len,0);
fact[0] = infact[0] = 1;
for (int i = 1; i < N; i ++ )
{
    fact[i] = (LL)fact[i - 1] * i % mod;
    infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2, mod) % mod;
}
//实际组合数 只需调用如下函数求 C(n,k)%p
int C(int n, int k, int p) {
    if (k > n) return 0;
    return (LL)fact[n] * infact[k] % p * infact[n - k] % p;
}

七、卡特兰数

在这里插入图片描述

八、第二类斯特林数

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

洗地机好用吗?哪款型号值得推荐?看完本文你就知道

在如今社会生活节奏不断加快的情况下&#xff0c;洗地机已经成为众多家庭的必备的清洁设备&#xff0c;面对市面上种类繁多的洗地机&#xff0c;我们常常会发出感叹“洗地机好用吗&#xff1f;洗地机哪个型好用&#xff1f;”等的疑问&#xff0c;今天&#xff0c;为了帮助大家…

一文搞定用python实现终身免费的听书工具

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

C语言程序练习——汉诺塔递归

1. 题目 在终端输入汉诺塔层数n&#xff0c;实现将n层汉诺塔通过三座塔座A、B、C进行排列 2. 代码 #include <stdio.h>int hannuota(int len, int str, int tmp, int dst) {if (1 len){printf("%c -> %c\n", str, dst);}else{hannuota(len-1, str, dst, …

好展位、抢先订!2024第二十二届上海国际涂料展|上海涂料展

致/To: 展会负责人、 市场部、 企划部、 销售部负责人 2024中国国际涂料博览会暨第二十二届中国国际涂料展览会 时间&#xff1a;2024年8月7-9日 地点&#xff1a;上海新国际博览中心 主办方&#xff1a; 中国涂料工业协会 承办方&#xff1a; 北京涂博国际展览有限公司 …

javaSwing坦克大战游戏

在游戏开发领域&#xff0c;坦克大战是一款经典的游戏&#xff0c;其简单而又耐玩的玩法吸引了无数玩家。而今&#xff0c;在Java编程技术的支持下&#xff0c;我们可以用Java Swing技术轻松实现这款经典游戏。本文将介绍如何使用Java Swing技术编写坦克大战游戏&#xff0c;并…

某对象存储元数据集群改造流水账

软件产品&#xff1a;某厂商提供的不便具名的对象存储产品&#xff0c;核心底层技术源自HDFS和Amazon S3&#xff0c;元数据集群采用了基于MongoDB的NOSQL数据库产品和MySQL数据库产品相结合。 该产品的元数据逻辑示意图如下&#xff1a; 业务集群现状&#xff1a;当前第3期建…

Qt 窗口MainWindow(上)

Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、多个浮动窗口&#xff08;…

JVM第八讲:GC - Java 垃圾回收基础知识

GC - Java 垃圾回收基础知识 本文是JVM第八讲&#xff0c; Java 垃圾回收基础知识。垃圾收集主要是针对堆和方法区进行&#xff1b;程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的&#xff0c;只存在于线程的生命周期内&#xff0c;线程结束之后也会消失&#xff0…

Vue3尚硅谷张天禹笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…

Java零基础入门到精通_Day 3

37 switch default&#xff1a; 后面的break;可以省略 38 春夏秋冬 注意事项:在switch语句中&#xff0c;如果case控制的语句体后面不写break&#xff0c;将出现穿透现象&#xff0c;在不判断下一个case值的情况下&#xff0c;向下运行 直到遇到break&#xff0c;或者整体swi…

在Python中进行封装

在Python中&#xff0c;封装是一种面向对象编程&#xff08;OOP&#xff09;的特性&#xff0c;它允许我们将数据&#xff08;属性&#xff09;和操作这些数据的方法&#xff08;函数&#xff09;捆绑在一起&#xff0c;形成一个独立的对象。封装的主要目的是隐藏对象的内部状态…

如何保证缓存与数据库的双写一致性?

如何保证缓存与数据库的双写一致性&#xff1f; 概述同步策略更新缓存还是删除缓存&#xff1a;先操作数据库还是缓存&#xff1a;案例一、先删除缓存&#xff0c;在更新数据库案例二 先操作数据库&#xff0c;再删除缓存 延时双删策略&#xff08;不推荐&#xff09;使用分布式…

Java拆装箱及128陷阱

有以下一段代码&#xff1a; Integer a 123; Integer b 123; int c 123; int d 123; System.out.println(c d); System.out.println(a b); System.out.println(a c); 这段代码运行的结果是什么呢&#xff1f; c d 一定为True。 由于Java中存在自动拆装箱&#xff0…

刷到一个问题还请道友们解疑

问题如上&#xff0c;题目挺简单的&#xff0c;就是插入后排序的思路&#xff0c;我的代码如下&#xff1a; #include <bits/stdc.h>using namespace std; int f(int x,int y){return x < y;//其实要这个没有用&#xff0c;默认是就是从小到大排序 }int main(){int n…

【MySQL】详谈约束

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

PostgreSQL中控制文件的解析与恢复

最近遇到有人问起PG中控制文件的一些使用问题,总结了一下。 1、PG控制文件简介 1.1、存储的位置 它的路径位于: 相关信息,可以用命令pg_controldata得到: [10:41:27-postgres@centos2:/var/lib/pgsql/14/data/global]$ pg_controldata -D $PGDATA pg_control version …

git提交和回退

目录 一. git 提交二. git commit 后准备回退&#xff0c;尚未 git push三. git add 添加多余文件 撤销操作四. 更改 Git commit 的默认编辑器五. 撤销某个commit的变更六. 回退到之前的commit状态总结&#xff1a; 一. git 提交 git pull # 更新代码 git status # 查看代码状…

【保姆级讲解如何Stable Diffusion本地部署】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

rancher2.6部署

rancher2.6部署 1、准备环境镜像 2、部署3、密码获取密码设置新密码 4、设置语言5、导入已有集群 1、准备 环境 docker-ce-20.10.23-3.el8.x86_64.rpm以及依赖rpm kubernetes&#xff1a;v1.23.17 镜像 &#xff08;rancher和k8s有个版本对应关系&#xff0c;rancher2.5就不…

OSCP靶场--GLPI

OSCP靶场–GLPI 考点(CVE-2022-35914 php执行函数绕过ssh端口转发jetty xml RCE) 1.nmap扫描(ssh端口转发) ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.194.242 -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-26 22:22 EDT Nmap…