![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
常用数学知识
算法中常用数学
剑决浮云气
事了拂衣去,深藏功与名
展开
-
求最大公约数欧几里得算法
gcd(a,b) = gcd(b,a mod b)(不妨设a>b 且r=a mod b ,r不为0)a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r因此d也是b,a mod b的公约数假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数原创 2021-01-18 21:14:50 · 64 阅读 · 0 评论 -
约数之和
#include <iostream>#include <map>using namespace std;typedef long long LL;int n;//输入n个数 求n个数的乘积后的约数个数const int Mod = 1e9+7;//数太大需要取余 int main(int argc, char** argv) { scanf("%d",&n); //<素数,次幂> map<int , int> Prime;原创 2021-01-18 21:07:44 · 64 阅读 · 0 评论 -
约数个数
求一个数的约数的个数把一个数分解完质因数N = (a1 ^ p1) * (a2 ^p2) * (a3 ^ p3) * ……*(an ^ pn)的形式那么从a1 ^ 0 到 a1 ^ p1都是N的约数同理从a2 ^ 0 到 a2 ^ p2都是N的约数…所以约数个数(p1+1)x(p2+1)x(p3+1)x…(pn+n)题目给定n个正整数ai,请你输出这些数的乘积的约数个数,答案对109+7取模。输入格式第一行包含整数n。接下来n行,每行包含一个整数ai。输出格式输出一个整数,表示原创 2021-01-18 21:06:32 · 124 阅读 · 0 评论 -
埃式筛法
求[2,n]之间的所有的质数,如果用试除法,太慢了原理:筛掉所有质数的倍数,因为所有的合数 都是质因数的倍数,筛掉所有的合数,剩下的就是质因数#include <iostream>#include <cstring>using namespace std;const int MAX = 1e7+1;int Prime[MAX];//存放素数 int Visit[MAX];//代表该数是否被筛掉 true代表筛掉 int Cnt;//记录素数个数//筛选2-n的原创 2021-01-18 13:07:15 · 78 阅读 · 0 评论 -
分解质因数
每个合数都能拆分成几个质数相乘的形式void divide(int n){ for(int i = 2; i <= n/i; i++) { if(0 == n%i)//这个i必定是质数 因为小的合数会被分解成小的质数 { //s代表这个质因子出现的次数 int s = 0; while(0 == n%i) { s++; n /= i; } //质因子i 出现了s次 printf("%d %d\n",i,s); } }原创 2021-01-18 12:28:17 · 78 阅读 · 0 评论 -
质数(素数)
质数的定义:大于1,只包含1和它本身是是约数,那么它就是质数①试除法给定一个数N,如果不能整除 [2,根号下N]内的所有数,那么它就是质数。设N = a*b,有min(a,b) <= 根号下N,令a <= b。只要检查[2, 根号下N]的数,如果N不是素数,那么就能找到一个a。如不存在这个a,那么(根号下N,根号下(N-1) ]也不存在bbool IsPrime(int nNum){ if(2 > nNum) { return false; } //这里改成 i &l原创 2021-01-18 12:17:01 · 551 阅读 · 0 评论