《算法笔记》 第五章 入门篇(3)--数学问题_算法第五章组合数学基础内容-程序员宅基地

技术标签: 算法  c++  

最大公约数–欧几里得算法 gcd(a,b)=gcd(b,a%b)

int gcd(int a,int b)
{
    
	if(b==0)
	{
    
		return a;
	}
	else
	{
    
		return gcd(b,a%b);
	}
} 

最小公倍数

int lcm(int a,int b)
{
    
	int d=gcd(a,b);
	return a/d*b;
}

分数的定义与化简

struct Fraction{
    
	int up,down;
}; 
//化简分数
Fraction reduction(Fraction result)
{
    
	if(result.down<0)
	{
    
		result.up=-result.up;
		result.down=-result.down;
	}
	if(result.up==0)
	{
    
		result.down=1;
	}
	else
	{
    
		int d=gcd(abs(result.up),abs(result.down));
		result.up/=d;
		result.down/=d;
	}
	return result;
} 

素数(也称质数)合数
素数的判断

bool isPrime(int n)
{
    
	if(n<=1)
	{
    
		return false;
	}
	int sqr=(int)sqrt(1.0*n);
	for(int i=2;i<=sqr;i++)
	{
    
		if(n%i==0)
		{
    
			return false;
		}
	} 
	return true;
} 

枚举素数的Eratosthenes筛法

int MAX=101;
int prime[101]={
    0};
int pnum=0;
bool isp[101]={
    false};
void findprime()
{
    
	for(int i=2;i<MAX;i++)
	{
    
		if(isp[i]==false)
		{
    
			prime[pnum++]=i;
			for(int j=i+i;j<MAX;j+=i)
			{
    
				isp[j]=true;
			}
		}
	}
}

质因子分解(在获得质数表的基础上解题)

struct factor{
    
	int x,cnt;
}fac[10];
int n=180;//需要被分解的数字
int num=0;
void fenjie(int n){
    
	int i=0;
	int m=n;
	while(prime[i]<=sqrt(m))
	{
    
		cout<<prime[i]<<endl;
		cout<<sqrt(m)<<endl;
		if(n%prime[i]==0)
		{
    
			fac[num].x=prime[i];
			fac[num].cnt=0;
			while(n%fac[num].x==0)
			{
    
				fac[num].cnt++;
				n=n/prime[i];
			}
			num++;
		}
		i++;
	}
	if(n!=1)
	{
    
		fac[num].x=n;
		fac[num++].cnt=1;
	}
}

额外基础知识:注意结构体使用 struct 或typedef strcut的不同情况,详见收藏夹
大整数运算
定义和读入

struct bign{
    
	int d[1000];
	int len;
	bign(){
    
		memset(d,0,sizeof(d));
		len=0;		
	}	
}; 

bign change(string str)//或是char str[] 
{
    
	bign a;
	a.len=str.length();
	for(int i=0;i<a.len;i++)
	{
    
		a.d[i]=str[str.length()-i-1]-'0';
	}
	return a;
}

大整数加法

bign add(bign a,bign b)
{
    
	bign c;
	int carry=0;
	for(int i=0;i<a.len||i<b.len;i++)
	{
    
		int temp=a.d[i]+b.d[i]+carry;
		c.d[c.len++]=temp%10;
		carry=temp/10;
	}
	if(carry!=0)
	{
    
		c.d[c.len++]=carry;
	}
	return c;
}

大整数减法

bign sub(bign a,bign b)
{
    
	bign c;
	for(int i=0;i<a.len||i<b.len;i++)
	{
    
		if(a.d[i]<b.d[i])
		{
    
			a.d[i+1]--;
			a.d[i]+=10;
		}
		c.d[c.len++]=a.d[i]-b.d[i];
	}
	while(c.len-1>=1&&c.d[c.len-1]==0)
	{
    
		c.len--;
	}
	return c;
} 

高精度*低精度

bign multi(bign a,int b)
{
    
	bign c;
	int carry=0;
	for(int i=0;i<a.len;i++)
	{
    
		int temp=a.d[i]*b+carry;
		c.d[c.len++]=temp%10;
		while(carry!=0)
		{
    
			c.d[c.len++]=carry%10;
			carry/=10;
		}
	}
	return c;
}

高精度÷低精度

bign divide(bign a,int b,int& r)
{
    
	bign c;
	c.len=a.len;
	for(int i=a.len-1;i>=0;i--)
	{
    
		r=r*10+a.d[i];
		if(r<b)
		{
    
			c.d[i]=0;
		}
		else
		{
    
			c.d[i]=r/b;
			r=r%b;
		}
	}
	while(c.len-1>=1&&c.d[c.len-1]==0)
	{
    
		c.len--;
	}
	return c;
}

扩展欧几里得算法 ax+by=gcd(a,b)此处为引用,因此在结束后传入的xy即为所求

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

扩展欧几里得方法主要运用于计算ax+by=c,用上述方法求解再乘c/gcd(a,b)即可,要求c%gcd(a,b)==0
同余数 逆元的求解
组合数
计算n!的末尾有多少个质因子p(可以用该算法算出n!末尾有几个零cal(n,5))

int cal(int n,int p)
{
    
	int ans=0;
	while(n)
	{
    
		ans+=n/p;
		n/=p;
	}
	return ans;
}

计算组合数Cnm(n在下m在上)

long long C(long long n,long long m)
{
    
	long long ans=1;
	for(long long i=1;i<=m;i++)
	{
    
		ans=ans*(n-m+i)/i;
	}
	return ans;
}

快速幂(计算的是a的n次方%m)

long long binaryPow(long long a,long long b,long long m) 
{
    
	if(b==0)
	{
    
		return 1; 
	}
	if(b%2==1)
	{
    
		return a*binaryPow(a,b-1,m)%m;
	}
	else
	{
    
		long long mul=binaryPow(a,b/2,m);
		return mul*mul%m;
	}
}

计算组合数Cnm(n在下m在上)%p

const int maxn=100000;
int prime[maxn] ;
int C(int n,int m,int p)
{
    
	int ans=1;
	for(int i=0;prime[i]<=n;i++)
	{
    
		int c=cal(n,prime[i])-cal(m,prime[i])-cal(n-m,prime[i]);
		ans=ans*binaryPow(prime[i],c,p)%p;
	}
	return ans;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/z__YYYYY/article/details/123601634

智能推荐

HBase数据大批量导入方式总结和对比_hbase 大数据量导入-程序员宅基地

文章浏览阅读3.4k次,点赞4次,收藏19次。HBase数据导入1. 背景在实际生产中,海量数据一般都不是直接存储在HBase中,这时候就需要一个数据导入到HBase的步骤上一篇博客讲述了可以通过java api的方式或者shell 客户端方式导入或者创建数据,但这对于实际生产中海量数据导入来说,速度和效率都太慢了,所以我们需要使用其他方式来解决海量输入导入到HBase的问题利用HBase底层文件是HFile形式存储再HDFS中,所以如果能够直接生成HFile的话,这时候再让HBase从HFile中读取数据,就会快很多。2. 批量数据导入_hbase 大数据量导入

Qt 串口通信之使用16进制发送数据的转换方式_qt串口发送16进制数据-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏18次。16进制QString转成16进制QByteArray一 概述 有时候在做上位机串口通讯时,经常需要将字符串转成16进制的形式作为发送,借此分析记录一下。二 需求分析//假设需要转换的字符:如下QString str = "abcdef1234";//需求转换成 0xab,0xcd,0xef,0x12,0x34 由上图分析得出,很明显我们只需要拆分字符串然后再重新合并就ok啦,知道了解决方法,接下来就是上代码。三 编写代码方法1:/*******************_qt串口发送16进制数据

multipartfile上传文件 大小限制_multipartfile 大小限制-程序员宅基地

文章浏览阅读1.4w次,点赞7次,收藏15次。关于文件上传大小 主要看一个错误org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (59500387) exceeds the configured maximum (10485760) at org.apache.tomcat.util.http.fileupload.impl.FileItemIteratorImpl.ini_multipartfile 大小限制

基于python的信用卡评分模型_python 信用 评分卡模型-程序员宅基地

文章浏览阅读4.4w次,点赞45次,收藏418次。基于python的信用卡评分模型1. 项目背景介绍1.1 信用风险和评分卡模型的基本概念 信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险,即受信人不能履行还本付息的责任而使授信人的预期收益与实际收益发生偏离的可能性,它是金融风险的主要类型。 借贷场景中的评分卡是一种以分数的形式来衡量风险几率的一种手段,也是对未来一段时间内违约、逾期、失联概率的预测。一般来说..._python 信用 评分卡模型

linux 下 tcpdump 详解 前篇(libpcap库源码分析)_libcap 源码-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏22次。一 概述用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 至于tcpdump参数如何使用,这不是本章讨论的重点。liunx系统抓包工具,毫无疑问就是tcpdump。而windows的抓包工具,wireshark也是一款主流的抓包工具。wireshark 使用了winpcap库。tcpdump..._libcap 源码

http://mirrors.aliyun.com/epel/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 --程序员宅基地

文章浏览阅读6.5k次,点赞14次,收藏11次。http://mirrors.aliyun.com/epel/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - “The requested URL returned error: 404 Not Found”Trying other mirror.Error: Cannot retrieve repository metadata (repomd.xml) for repository: epel. Please verify its_/epel/6/x86_64/repodata/repomd.xml: [errno 14] pycurl error 22 - "the reques

随便推点

悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)-程序员宅基地

文章浏览阅读105次。急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。请问:你用有限的资金最多能采购多少公斤粮食呢?后记:人生是一个充满了变数的生命过程,天灾、人祸、病痛是我们生命历程中不可预知的威胁。月有阴晴圆缺,人有旦夕祸福,未来对于我们而言是一个未知数。那么,我们要做的就应该是珍惜现在,感恩生活——感谢父母,他们给予我们生命,抚养我们成人;感谢老师,他们授给我们知识,.

Android源码设计模式探索与实战【面向对象六大基本原则】_android源码设计模式第2版 csdn-程序员宅基地

文章浏览阅读2.9k次,点赞43次,收藏40次。IT行业,一直讲一句话,拼到最后都拼的是“内功”,而内功往往就是指我们处理问题的思路、经验、想法,而对于开发者来说,甚至对于产品也一样,都离不开一个“宝典”,就是设计模式。今天我们一起借助Android源码去探索一下设计的六大基本原则。同时结合我工作经验中的两个例子,来总结实践一下。1.背景&定义定义:设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。理解:设计模式是什么?设计模式(Desi._android源码设计模式第2版 csdn

这台计算机似乎没有安装操作系统_前沿科技 | 浙江大学科学家联合之江实验室成功研制全球神经元规模最大的类脑计算机...-程序员宅基地

文章浏览阅读172次。1.6米高的三个标准机柜并排而立,黑色的外壳给人酷酷的感觉,红色的信号灯不停地闪烁,靠得近些似乎能听到里面脉冲信号飞速奔跑的声音。近日,浙江大学科学家团队联合之江实验室共同研制成功了我国首台基于自主知识产权类脑芯片的类脑计算机(Darwin Mouse)。这台类脑计算机包含792颗浙江大学研制的达尔文2代类脑芯片,支持1.2亿脉冲神经元、近千亿神经突触,与小鼠大脑神经元数量规模相当,典型..._浙江大学 类脑 方向

实现RTSP摄像机进行网页直播和微信直播的技术方案:EasyNVR版本免费更新方法_easynvr免费版-程序员宅基地

文章浏览阅读2.7k次。问题背景前文我们提过为保障服务器正常稳定运作,EasyNVR有专业的运维(售前支撑、商务咨询、售后维护)团队,随时对客户各种突发情况快速响应处理,保证互联网直播的顺利进行。这部分工作就包括技术问题咨询、需求分析、方案制定、版本更新、功能提升等,随着用户基数的增加,运维过程中或多或少存在一些回复延迟,主要包括以下几个方面:EasyNVR的用户越来越多,技术人员一一对应解答效率不高;随着Eas..._easynvr免费版

P1541 [NOIP2010 提高组] 乌龟棋 题解_乌龟棋2010-程序员宅基地

文章浏览阅读401次,点赞3次,收藏4次。更好的阅读体验蒟蒻的第一篇题解P1541 [NOIP2010 提高组] 乌龟棋简单的背包 首先确定状态,dp[a][b][c][d]用来存储使用a张爬行卡片1,b张爬行卡片2,c张爬行卡片3,d张爬行卡片4时的最大得分。 我们需要开一个桶的数组t存4种牌的个数,以便于暴力。 dp数组初始化。很显然,四种卡片都用0张时,在起点,分数为score[1] 即: dp[0][0][0][0]=score[1]; 状态转移。DP 4种卡片的个数,状态转移方程为_乌龟棋2010

计算机网络 | 划分子网_计算机网络子网划分-程序员宅基地

文章浏览阅读5.5k次,点赞11次,收藏69次。划分子网概念先知了解 什么是子网?了解 为什么要划分子网?划分子网的好处/优点是什么?介绍 子网掩码总结 子网掩码记住 IP 地址的自然分类问题求解一个网络,主机号有x位,则这个网络可以分配给主机的IP地址有多少个?子网划分实例问题1题目分析题目解题方法参考内容概念先知了解 什么是子网?子网或子网络是网络内部的网络。子网使网络更高效。通过子网划分,网络流量传播距离更短,无需通过不必要的路由器即可到达目的地。了解 为什么要划分子网?划分子网的好处/优点是什么?1.减少广播带来的负面影响2.节_计算机网络子网划分