唯一分解定理:任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的。换句话说,一个数能被唯一地分解成质因数的乘积。即 N = p1^a1 * p2^a2 * p3^a3 * ...* pn^an 。 其中p1,p2....pn为素数。
代码实现:
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 10;
int pre[maxn];
int a[maxn];
int cnt = 0;
void dabiao()
{
memset(pre,0,sizeof(pre));
for(int i= 2; i < maxn; i++)
{
if(!pre[i])
{
a[cnt++]= i;
for(intj = 1; j * i < maxn; ++j)
{
pre[i*j]= 1;
}
}
}
}
int main()
{
dabiao();
intb[maxn];
memset(b,0,sizeof(b));
int n;
scanf("%d",&n);
int k =n;
while(n!= 1)
{
for(inti = 0; i < cnt; i++)
{
if(n% a[i] == 0)
{
b[a[i]]++;
n/= a[i];
break;
}
}
}
return 0;
}
组合数学:
一、求能除尽n的正整数数目
n = p1^a1* p2^a2 * p3^a3 * ...* pn^an 。 其中p1,p2....pn为素数。
数目N = (a1 + 1) * (a2 + 1) * (a3 + 1) * …* (an +1) – 1
二、求n!末尾有几个0
把n!分解成素数的乘积时,2和5的幂是多少?0的个数就等于2和5幂中最小的一个
三、走矩形方格,从(0,0)点走到(n,m)有多少种走法
N = C(n+m,m)
四、计算有n个有标号的顶点的树的数目,即n个顶点v1,v2……vn,用n-1条边相连
N = n^ (n – 2)
五、在n个不同的元素中取r个进行组合,允许重复或 (r个无区别的球放进n个有区别的盒子里,每盒放的球可多余一个)
N = C(n + r – 1, r)
六、组合公式 C(n,m) = C(n-1,m) + C(n-1,m-1)
七、 (1) S1 = 1 + 2 + 3 + 4 + … + n = (1/2) * n * (n+1)
(2) S2 = 1 * 2 + 2 * 3 + 3 * 4 + … + n* (n+1) = (1/3) * n (n + 1) * (n+2)
(3) S3 = 1 * 2 * 3 + 2 *3 * 4 + … + n * (n+1) * (n+2)
= (1/4) * n *(n+1)*(n+2)* (n+3)z