【算法基础】数学知识

2023-09-19 17:34:41

质数

质数的判定

866. 试除法判定质数 - AcWing题库

时间复杂度是logN

#include<bits/stdc++.h>
using namespace std;
int n;
bool isprime(int x)
{
	if(x<2) return false;
	
	for(int i=2;i<=x/i;i++)
	{
		if(x%i==0) return false;
	}
	return true;
}
signed main()
{
	cin>>n;	
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		if(isprime(x)) puts("Yes");
		else puts("No");
	}
	
	return 0;
} 

分解质因数 

867. 分解质因数 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
int n;
void divide(int x)
{
	for(int i=2;i<=x/i;i++)
	{
		if(x%i==0) 
		{
			int s=0;
			while(x%i==0) x/=i,s++;
			cout<<i<<" "<<s<<endl;
		}
	}
	if(x>1) cout<<x<<" "<<1<<endl;
	cout<<endl;
}
signed main()
{
	cin>>n;	
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		divide(x);
	}
	
	return 0;
} 

 筛质数(用线性筛,O(N)

 868. 筛质数 - AcWing题库

朴素版,埃氏筛法

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
bool st[N];
int prime[N],cnt;
int n;
void getprimes(int x)
{
	for(int i=2;i<=x;i++)
	{
		if(st[i]) continue;
		prime[cnt++]=i;
		for(int j=i+i;j<=x;j+=i) st[j]=true;
	}
	
}
signed main()
{
	cin>>n;	
	getprimes(n);
	cout<<cnt;
	
	return 0;
} 

 线性筛

868. 筛质数 - AcWing题库

线性筛把时间复杂度优化到O(n),就需要保证筛去一个数只用一次,保证最小质因数就可以确保这一点。

如。筛去24,24=2*12,24=3*8,显然这里2是最小质因数,如何确保不筛去3*8?

这里3*8=3*2*4,即i包含上一个prime,直接break。

只要i包含了prime就不能保证最小质因数!!

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
bool st[N];
int prime[N],cnt;
int n;
void getprimes(int x)
{
	for(int i=2;i<=x;i++)
	{
		if(!st[i]) prime[cnt++]=i;
		
		for(int j=0;prime[j]<=x/i;j++)
		{
			st[prime[j]*i]=true;
			if(i%prime[j]==0) break;
		}
	}
	
}
signed main()
{
	cin>>n;	
	getprimes(n);
	cout<<cnt;
	
	return 0;
} 

约数

试除法求一个数的所有约束

869. 试除法求约数 - AcWing题库

#include<bits/stdc++.h>
using namespace std;

void solve(int x)
{
	stack<int> s;
	for(int i=1;i<=x/i;i++)
	{
		if(x%i==0) 
		{
			cout<<i<<' ';
			if(i!=x/i) s.push(x/i);
		}
	}
	while(s.size())
	{
		cout<<s.top()<<" ";
		s.pop();
	}
	puts("");
}
signed main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int x;
		cin>>x;
		solve(x);
	}
	return 0;
} 

 约数个数//约数之和

870. 约数个数 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long LL;
signed main()
{
	int n;
	cin>>n;
	unordered_map<int,int> mp;
	while(n--)
	{
		int x;
		cin>>x;
		for(int i=2;i<=x/i;i++)
		{
			while(x%i==0)
			{
				mp[i]++;
				x/=i;
			}
		}
		if(x>1) mp[x]++;
	}
	
	LL res=1;
	for(auto p:mp) res=res*(p.second+1)%mod;
	
	cout<<res<<endl; 
	return 0;
} 

 871. 约数之和 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long LL;
signed main()
{
	int n;
	cin>>n;
	unordered_map<int,int> mp;
	while(n--)
	{
		int x;
		cin>>x;
		for(int i=2;i<=x/i;i++)
		{
			while(x%i==0)
			{
				mp[i]++;
				x/=i;
			}
		}
		if(x>1) mp[x]++;
	}
	
	LL res=1;
	for(auto p:mp)
	{
		LL a=p.first,b=p.second;
		LL t=1;
		while(b--) t=(t*a+1)%mod;//秦九韶
		res=res*t%mod; 
	}
	
	cout<<res<<endl; 
	return 0;
} 

最大公约数

872. 最大公约数 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
int gcb(int a,int b)
{
	return b?gcd(b,a%b):a;
}
signed main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int a,b;
		cin>>a>>b;
		cout<<gcd(a,b)<<endl; 
	}
	return 0;
} 

 
欧拉函数 

求任意一数的欧拉函数  O(n*sqrt(a)) 

 873. 欧拉函数 - AcWing题库

 

#include<bits/stdc++.h>
using namespace std;

signed main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int x;
		cin>>x;
		int res=x;
		for(int i=2;i<=x/i;i++)
		{
			if(x%i==0)
			{
				res=res/i*(i-1);
				while(x%i==0) x/=i;
			} 
		}
		if(x>1) res=res/x*(x-1);
		cout<<res<<endl;
	}
	return 0;
} 

求1-n中每个数的欧拉函数  O(n)

874. 筛法求欧拉函数 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int prime[N],cnt;
bool st[N];
int phi[N];//欧拉函数

typedef long long LL; 
signed main()
{
	int n;
	cin>>n;
	phi[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!st[i]) 
		{
			prime[cnt++]=i;
			phi[i]=i-1;//质数的欧拉函数 
		}
		
		for(int j=0;prime[j]<=n/i;j++)
		{
			st[prime[j]*i]=true;
			
			if(i%prime[j]==0) 
			{
				phi[prime[j]*i]=prime[j]*phi[i];         
				//括号里质因子是一样的,只是n要多乘上一个 
				break;
			}
			phi[prime[j]*i]=phi[i]*(prime[j]-1); 
			//prime是质数且i不能整除prime,则说明两数没有公因数
			//那么prime[j]*i比i只是多了一个质因子prime[j] 
		}
	}
	LL res=0;
	for(int i=1;i<=n;i++) res+=phi[i];
	
	cout<<res;
	
	return 0;
}

 快速幂

快速幂

875. 快速幂 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

LL qmi(int a,int b,int p)
{
	LL res=1%p;
	
	while(b)
	{
		if(b&1) res=res*(LL)a%p;
		a=a*(LL)a%p;
		b>>=1;
	}
	return res;	
}
signed main()
{
	int n;	
	cin>>n;
	while(n--)
	{
		int a,b,p;
		cin>>a>>b>>p;
		cout<<qmi(a,b,p)<<endl;	
	}
	
	return 0;
} 

快速幂求逆元

876. 快速幂求逆元 - AcWing题库

(1)当a与p互质时,用快速幂求逆元(费马小定理):quick_power(a, b, p);
(2)当a与p不互质时,用扩展欧几里得算法求逆元:exgcd(a, p, x, y)。

概念: 

 证明:费马小定理(通俗易懂) - 知乎 (zhihu.com)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

LL qmi(int a,int b,int p)
{
	LL res=1%p;
	
	while(b)
	{
		if(b&1) res=res*(LL)a%p;
		a=a*(LL)a%p;
		b>>=1;
	}
	return res;	
}
signed main()
{//当a和p不互质时无解,由于p是质数,也就只有a是p的倍数时无解 
	int n;	
	cin>>n;
	while(n--)
	{
		int a,b,p;
		cin>>a>>p;
		if(a%p==0) puts("impossible"); 
		else cout<<qmi(a,p-2,p)<<endl;	
	}
	
	return 0;
} 

 扩展欧几里得算法

扩展欧几里得算法

877. 扩展欧几里得算法 - AcWing题库

主要是递归。先正着求出gcd的值,求完之后倒着求x,y。

AcWing 877. 扩展欧几里得算法 - AcWing

#include<bits/stdc++.h>
using namespace std;

int exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;	
	}	
	int x1,y1,gcd;
	gcd=exgcd(b,a%b,x1,y1);
	
	x=y1,y=x1-a/b*y1;
	return gcd;
}

signed main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int a,b,x,y;
		cin>>a>>b;
		exgcd(a,b,x,y);
		cout<<x<<" "<<y<<endl;
	}
	return 0;
}

 线性同余方程

878. 线性同余方程 - AcWing题库

想不明白主要应该是不太清楚裴属定理,看这个:裴蜀定理 - OI Wiki (oi-wiki.org)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;	
	}	
	int x1,y1,gcd;
	gcd=exgcd(b,a%b,x1,y1);
	
	x=y1,y=x1-a/b*y1;
	return gcd;
}

signed main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int a,b,m;
		cin>>a>>b>>m;
		
		int x,y;
		int d=exgcd(a,m,x,y);
		
		if(b%d) puts("impossible");
		else cout<<(LL)b/d*x%m<<endl;
		
	}
	return 0;
}

 中国剩余定理

204. 表达整数的奇怪方式 - AcWing题库

基础中国剩余定理:算法学习笔记(10): 中国剩余定理 - 知乎 (zhihu.com)

好难,明天再看

高斯消元法

883. 高斯消元解线性方程组 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const double eps = 1e-8; 
int n;
double a[N][N];
 
int gauss()  // 高斯消元,答案存于a[i][n]中,0 <= i < n
{
    int c,r;//列,行
	
	for(c=0,r=0;c<n;c++)//遍历所有列 
	{
		int t=r;//最上面一个,还没确定
		 
		for(int i = r ; i < n ; i ++)
		{
			if( fabs(a[i][c]) > fabs(a[t][c]) ) t=i;//把最大的换上去 
		}	
		
		if(fabs(a[t][c])<eps) continue;//如果这个最小的是0,跳过 


		for(int i=c;i<=n;i++)	swap(a[t][i],a[r][i]);//交换 
		
		for(int i=n;i>=c;i--) a[r][i]/=a[r][c]; //首位变成1 
		
		for(int i=r+1;i<n;i++)
		{
			if(fabs(a[i][c])>eps)
			{
				for(int j=n;j>=c;j--)
				{
					a[i][j]-=a[r][j]*a[i][c];	
				}	
			}
		} 
        r ++ ;
    }

	if(r<n)
	{
		for(int i=r;i<n;i++)//从没走到的一行开始
		{
			if(fabs(a[i][n])>eps) return 2;//无解 
		}
		return 1; //无穷解 
	}
	
	//只有一解
	for(int i=n-1;i>=0;i--)
	{
		for(int j=i+1;j<n;j++)
		{
			a[i][n]-=a[i][j]*a[j][n];
		}
	} 
	return 0;
}
 
signed main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n+1;j++)
		{
			cin>>a[i][j];		
		}
	}	
	
	int t=gauss();
	
    if (t == 2) puts("No solution");
    else if (t == 1) puts("Infinite group solutions");
    else
    {
        for (int i = 0; i < n; i ++ )
            printf("%.2lf\n", a[i][n]);
    }
	return 0;
} 

从1开始存的版本。

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const double eps=1e-8;
int n;
double a[N][N];

int gauss()
{
	int r=1,c=1;//行列,r<=n,c<=n+1
	
	for(r=1,c=1;c<=n;c++) //遍历每一列 
	{
		int t=r;//记录行 
		
		for(int i=t;i<=n;i++)
		{
			if(fabs(a[i][c]>fabs(a[t][c])))	t=i;	
		}
		if(fabs(a[t][c])<eps) continue;
		
		//走了几列同时代表确定了几行 
		for(int i=c;i<=n+1;i++)	swap(a[t][i],a[r][i]);
		
		for(int i=n+1;i>=c;i--) a[r][i]/=a[r][c];
		
		for(int i=r+1;i<=n;i++)//对每一行 
		{
			if(fabs(a[i][c])<eps) continue;//如果这个是0,不操作
			
			for(int j=n+1;j>=c;j--)
			{
				a[i][j]-=a[r][j]*a[i][c];	
			} 
		} 
		
		r++;
	}
	
	if(r<n+1)
	{
		for(int i=r;i<=n;i++)
		{
			if(fabs(a[i][n+1])>eps) return 0;//无解 
		}
		return 2;//无穷解 
	}
	
	for(int i=n-1;i>=1;i--)
	{
		for(int j=i+1;j<=n+1;j++)
		{
			a[i][n+1]-=a[j][n+1]*a[i][j];	
		}	
	} 
	return 1;
}
signed main()
{
	cin>>n;	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n+1;j++)
		{
			cin>>a[i][j];
		}
	}
	
	int t=gauss();
	
	if(t==0) puts("No solution");
	else if(t==2) puts("Infinite group solutions");
	else
	{
		for(int i=1;i<=n;i++) printf("%.2lf\n",a[i][n+1]);
	}
	
	return 0;
}

884. 高斯消元解异或线性方程组 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N=110;

int n;
int a[N][N];

void guass()
{
	int r,c;
	for(r=1,c=1;c<=n;c++)//枚举列 
	{
		int t=r;
		
		for(int i=r;i<=n;i++)
		{
			if(a[i][c])
			{
				t=i;
				break;
			}	
		}
		if(a[t][c]==0) continue;//说明第c列都是0 
		
		for(int i=c;i<=n+1;i++) swap(a[r][i],a[t][i]);
		
		for(int i=r+1;i<=n;i++)
		{
			if(a[i][c]==0) continue;
			
			for(int j=c;j<=n+1;j++)
			{
				a[i][j]^=a[r][j];	
			}	
		} 
		r++;
	}
	
	if(r<n+1)//说明等式左边都是0,判断等式右边即可 
	{
		for(int i=r;i<=n;i++)
		{
			if(a[i][n+1]!=0)//无解 
			{
				puts("No solution");
				return; 
			}
		} 
		puts("Multiple sets of solutions");
		return;
	}
	
	//输出结果
	for(int i=n-1;i>=1;i--)
	{
		
		for(int j=i+1;j<=n+1;j++)
		{
			a[i][n+1]^=a[i][j]*a[j][n+1];	
		}	
	} 
	for(int i=1;i<=n;i++)
	{
		cout<<a[i][n+1]<<endl;
	}
}
signed main()
{
	cin>>n; 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n+1;j++)
		{
			cin>>a[i][j];
		}
	}
	guass();	
	
	return 0;
}

求组合数

885. 求组合数 I - AcWing题库

1<=b<=a<=2000

#include<bits/stdc++.h>
using namespace std;
const int N=2010,mod=1e9+7;
int a[N][N];

void init()
{
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<=i;j++)
		{
			if(j==0) a[i][j]=1;
			else a[i][j]=(a[i-1][j]+a[i-1][j-1])%mod;
		}
	}
}
signed main()
{
	init();
	
	int n;
	cin>>n;
	while(n--)
	{
		int c,b;
		cin>>c>>b;
		cout<<a[c][b]<<endl;
	}
	
	return 0;
}

 886. 求组合数 II - AcWing题库

1<=b<=a<=1e5

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10,mod=1e9+7;

int fact[N],infact[N];
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;
}
signed main()
{
	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; 
	}

	int n;	
	cin>>n;
	while(n--)
	{
		int a,b;
		cin>>a>>b;
		cout<<(LL)fact[a]*infact[b]%mod*infact[a-b]%mod<<endl;
	}
	
	return 0;
}

更多推荐

JavaScript笔记——快速了解 ES6 新增字符串方法,开箱即用(含案例)

文章目录📋前言🎯includes()方法🎯startsWith()方法🎯endsWith()方法🎯repeat()方法🎯padStart()方法🎯padEnd()方法🎯trim()方法🎯trimStart()或trimLeft()方法🎯trimEnd()或trimRight()方法🎯replace

使用docker-compose 部署 MySQL8.0

目录一、拉取MySQL镜像二、创建挂载目录三、添加配置文件my.cnf(没有特殊需求可以跳过)四、编写docker-compose.yml文件五、启动容器六、运行后查看启动容器的情况七、连接测试一、拉取MySQL镜像我这里使用的是MySQL8.0.18,可以自行选择需要的版本。dockerpullmysql:8.0.1

OpenCV实战(31)——基于级联Haar特征的目标检测

OpenCV实战(31)——基于级联Haar特征的目标检测0.前言1.Haar特征图像表示2.基于级联Haar特征的二分类分类器3.级联分类器算法流程4.使用Haar级联检测器进行人脸检测5.完整代码小结系列链接0.前言在机器学习基础一节中,我们介绍了机器学习的一些基本概念,并通过使用不同类别的样本来构建分类器。但这种

基于网络表示学习的 新闻推荐算法研究与系统实现

摘要第1章绪论新闻推荐通常是利用用户的阅读行为和习惯、阅读选择和爱好等信息,为用户推荐新闻内容。新闻推荐能够减少用户在数量庞大数据信息中获取信息的时间消耗,从而能够缓解“信息过载[7]”的难题。以文本为内容的新闻,和商品、电影、短视频等推荐系统相比,新闻推荐系统自身的特点限制了该领域的发展速度,比如新闻的实时性和热点性

行云管家全面适配信创国产化平台 助力政企信创环境下数字化转型与安全运维

近日,作为云计算管理及信息安全领域优秀的产品服务提供商,深圳市行云绽放科技有限公司宣布旗下行云管家系列产品已全面适配信创国产化平台,包括CPU、服务器、数据库、浏览器等,为政企客户提供符合信创环境要求的云计算管理与信息安全运维服务。随着国家对信创产业的重视和支持力度不断加大,行云管家积极响应国家号召,致力于为政企客户提

助力工业物联网,工业大数据之安装事实指标需求分析【二十一】

文章目录1:安装事实指标需求分析2:安装事实指标构建1:安装事实指标需求分析目标:掌握DWB层安装事实指标表的需求分析路径step1:目标需求step2:数据来源实施目标需求:基于设备安装信息统计安装设备个数、收费安装个数、审核安装个数等指标全新安装数量:install_type=1联调安装数量:install_way

在酷开系统中寻找属于你的影音世界!

众所周知智能电视作为家庭场景C位,吸引越来越多的消费者重回电视大屏的怀抱。智能电视作为智能家居的一员,已经成为人们娱乐生活的重要组成部分。然而,与智能电视行业的快速发展相比,电视内容的供应似乎有些缺乏,很多电视厂商的智能电视只能满足基本的视频播放需求,但是在内容方面却显得有些单薄。故此,拥有海量影视资源的智能电视操作系

助力工业物联网,工业大数据之客户回访事实指标需求分析【二十三】

文章目录1:客户回访事实指标需求分析2:客户回访事实指标1:客户回访事实指标需求分析目标:掌握DWB层客户回访事实指标表的需求分析路径step1:目标需求step2:数据来源实施目标需求:基于客户回访数据统计工单满意数量、不满意数量、返修数量等指标数据来源ciss_service_return_visit:回访信息表s

如何隐藏或修改Docker容器中的Nginx响应头中的Server

背景介绍现在大部分项目通过Nginx作为反向代理,实际由于安全审计要求需要隐藏或修改响应头的Server信息,传统的项目直接部署在nginx服务器中,只需要在nginx服务器安装ngx_http_headers_more_filter_module插件,然后通过修改nginx.conf文件配置即可,但是自从容器化时代来

用于设计 CNN 的 7 种不同卷积

一说明最近对CNN架构的研究包括许多不同的卷积变体,这让我在阅读这些论文时感到困惑。我认为通过一些更流行的卷积变体的精确定义,效果和用例(在计算机视觉和深度学习中)是值得的。这些变体旨在保存参数计数、增强推理并利用目标问题的某些特定特征。这些变体中的大多数都简单易懂,因此我专注于了解每种方法的优点和用例。这些知识有望帮

【数据结构】优先级队列(堆)

文章目录💐1.优先级队列1.1概念💐2.堆的概念及存储方式2.1什么是堆2.2为什么要用完全二叉树描述堆呢?2.3为什么说堆是在完全二叉树的基础上进行的调整?2.4使用数组还原完全二叉树💐3.堆的常用操作-模拟实现3.1堆的创建3.1.1堆的向下调整(大根堆为例)3.1.2建堆的时间复杂度3.2堆的插入和删除3.

热文推荐