唯一分解定理入门
Posted wsy107316
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了唯一分解定理入门相关的知识,希望对你有一定的参考价值。
唯一分解定理:每一个大于1的正整数均可分解为有限个素数的积,如果不计素因数在乘积中的次序,则分解方式是唯一的。将n的素因数分解中相同的素因子收集到一起,可只每个大于1的正整数n可唯一地写成 n = p1a1p2a2p3a3...pkak,其中,p1,p2,p3,...,pk ,是互不相同的素数,而a1,a2,a3,...,ak 是正整数,上面的分解式称为n的标准分解。
性质:n的正约数个数,τ(n) = (1+a1)(1+a2)(1+a3)......(1+ak) ;n的正约数之和,σ(n)=(1+p1+...+p1a1)(1+p2+...+p2a2)...(1+pk+...+pkak)
模板代码:
1 /* */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <string> 6 #include <cmath> 7 #include <algorithm> 8 using namespace std; 9 typedef long long ll; 10 const int maxn=1e5; 11 bool is[maxn]; 12 int cnt=0; 13 ll a[maxn];//存素数 14 ll ds[maxn],zs[maxn];//ds是底数,zs是指数 15 16 void init()//打表,欧拉筛 17 18 memset(is,true,sizeof(is)); 19 is[0]=is[1]=false; 20 for(int i=2;i<maxn;i++) 21 22 if(is[i]) a[cnt++]=i; 23 for(int j=0; i*a[j]<maxn&&j<cnt; j++) 24 25 is[i*a[j]]=false; 26 if( i%a[j]==0 ) break; 27 28 29 30 31 ll fj(ll x)//不同素数的个数 32 33 ll k=0,flag=0; 34 for(ll i=0; i<cnt; i++ ) 35 36 while(x%a[i]==0) 37 38 if(flag==0) 39 40 flag=1; 41 k++; 42 43 x/=a[i]; 44 ds[k]=a[i]; 45 zs[k]++; 46 47 if(x==1) break; 48 flag=0; 49 50 if( x!=1 )//如果分解完x都不等于1,那么x必定是一个素数 51 52 k++; 53 ds[k]=x; 54 zs[k]=1; 55 56 return k; 57 58 59 int main() 60 61 init(); 62 ll x; 63 cin>>x; 64 ll k=fj(x); 65 for(ll i=1;i<=k;i++) printf("%lld^%lld%c",ds[i],zs[i],i==k?‘\n‘:‘+‘); 66 return 0; 67
以上是关于唯一分解定理入门的主要内容,如果未能解决你的问题,请参考以下文章