
数学问题
Bread Sir
记录算法之路
展开
-
素数的判断
素数素数是啥?知道了这个就能够知道如何判断一个数是否为素数了。这篇博文里详细说明了素数是啥 http://blog.youkuaiyun.com/karry_zzj/article/details/70147474素数: 如果一个整数a>1且只能被平凡约数1和它自身所整除,则这个数是素数。 也就是说素数是恰好有2个约数的整数,即1和它本身。素数的判断因为n的约数都不超过n,所以只要检查2~n-1的所有整数原创 2017-04-23 10:16:34 · 299 阅读 · 0 评论 -
扩展欧几里得算法
——by《紫书》问题引入:直线上的点。求直线ax+by+c=0上有多少个整点(x,y)满足x∈[x1,x2],y∈[y1,y2]。分析:这里先介绍本问题核心的算法——扩展欧几里得算法。扩展欧几里得算法: 找出一对整数(x,y),使得ax+by=gcd(a,b)。这里的x和y不一定是整数,也可能是0或负数。 ax+by = gcd(a,b)这个式子总是有解。void gcd(int a, in原创 2017-04-14 01:03:08 · 342 阅读 · 0 评论 -
求最大公约数——辗转相除法
最大公约数的求法在大一时候就学过了,但是当时的算法是效率很低的。然而还有一个简单、高效,而且相当优美的算法——辗转相除法,也就是欧几里得算法先了解一个定理——GCD递归定理: 对任意非负整数a和任意正整数b,gcd(a,b) = gcd(b,a mod b) 这个定理是这个算法的核心部分。这个定理的证明就不证明了,记住即可。所以这下来求gcd(a,b)就十分简单了,找到递归基:当b=0 , gc原创 2017-04-12 21:16:22 · 447 阅读 · 0 评论 -
Eratosthenes筛法
如果要将素数建个表,我们可以从1~n每个数进行素数判断,如果是则放入数组里。这个效率不算很高,那么有一种算法可以更好实现——Eratosthenes筛法。它的思想就是:对于不超过n的每个非负整数p,删除2p,3p,4p,…,当处理完所有数之后,还没有被删除的就是素数。#include<cstdio>#include<cstring>using namespace std;const int m原创 2017-04-13 13:45:39 · 2069 阅读 · 0 评论 -
数论——基础概念
——FROM 《Introduction to Algorithm》整除性与约数:我以前很容易把“除”和“除以”相混淆。记住a除b是b/a,a除以b是a/b。 而a整除b就是b =k*a(k为某个整数)。记作a|b 如果a|b且a>=0,那么称a是b的约数。素数与合数:素数: 如果一个整数a>1且只能被平凡约数1和它自身所整除,则这个数是素数。合数: 如果一个整数不是素数且大于1,则称为原创 2017-04-12 21:01:35 · 699 阅读 · 0 评论 -
同余与模运算
a mod b 表示a 除以 b的余数,在高级语言中表示成a % b 。int mod(int a,int b){ return a%b;}我们先记住下面几个公式:1.(a+b) mod n = ((a mod n) + (b mod n)) mod nint add_mod(int a, int b, int n){ a %= n; b %= n; return原创 2017-04-14 10:45:06 · 2256 阅读 · 1 评论 -
UVA11582 Colossal Fibonacci
问题描述:这题花了我一天时间调,还是自己渣,很多细节都没注意。分析:因为要求的是f(a^b) mod n,那么就可以设F(i) = f(i) mod n。 那么f(a^b) mod n = F(a^b)。这里有一个关键的地方,f(i) mod n 会重复循环,为什么会这样呢?因为斐波那契数列的每一项都只和前两项有关。所以共有n^2个可能,最后一定会出现循环节,也就是说余数最多n种,则最多n^2项就原创 2017-04-14 15:29:38 · 227 阅读 · 0 评论 -
高斯消元法——求解线性方程组
学习了《挑程》中的高斯消元法,它是求解最基础的线性方程组(未知数个数和方程个数相等,并且有唯一解)的算法。首先举一个例子:求解如下方程组: ⎧⎩⎨x−2y+3z=6..........①4x−5y+6z=12.......②7x−8y+10z=21.....③\begin{cases}x-2y+3z = 6..........①\\4x-5y+6z=12.......②\\7x-8y+10z原创 2017-08-17 13:23:46 · 6799 阅读 · 0 评论