算术基本定理
算术基本定理:
每个大于1的正整数N都可以表示成素数之积的形式 :
N=p1^a1*p2^a2*p3^a3...(pi代表素数,ai代表指数)
d(n)是n的正因子的个数:
d(n)=(a1+1)*(a2+1)*(a3+1)…
Sum(n)是n的所有因子之和:
Sum(n)=(1+p1+p1^2+…+p1^a1)*(1+p2+p2^2+……+p2^a2)*….
公式与推论都很容易理解,关键点在于如何分解;
两种分解方法:
#include<bits/stdc++.h>
#define MAXN 1e5
int N;
bool isprime[MAXN];
int prime[MAXN];//1-N中的素数
int cnt=0;//记录1-N中素数的个数
struct node
{
int p;
int num;
node() {p=0;num=0;}
} a[MAXN];
int m=0;//素数组元素个数
void init() //寻找1-N中的所有素数(埃氏筛)
{
memset(isprime,true,sizeof isprime);
for(int i=2;i<=N;i++)
{
if(isprime[i])
{
prime[cnt++]=i;
for(int j=2;i*j<=N;j++)
isprime[i*j]=false;
}
}
}
void solve(int N) //算术基本定理分解N
{
m=0;
for(int i=0;i<cnt;i++)
{
if(N%prime[i]==0)
{
while(N%prime[i]==0)
{
a[m].p=prime[i];
a[m].num++;
N/=prime[i];
}
m++;
}
}
}
当然还有更简单的分解方法:(只求出素数底数)wei
void solve(int n)
{
m=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
f[m++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1)
f[m++]=n;
}
唯一分解定理是真的重要啊...orz
多做题,多去用,没有最理解,只有更理解。