唯一分解定理
Posted 行远山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了唯一分解定理相关的知识,希望对你有一定的参考价值。
1.唯一分解定理,也叫算术基本定理,指的是任何n>=2,都可以分解为n=p1*p2*p3*.....pn,其中pi为质数。
其包括两个断言:断言1:数n可以以某种方式分解成素数乘积。
断言2:仅有一种这样的因数分解。(除因数重排外)。
其可以化简为 n=p1^x1*p2^x2*p3^x3.....pn^xn。
2.如何实现:
实现方法1:
#include <bits/stdc++.h> #define maxn 10005 typedef long long ll; using namespace std; int main() { int n,i=0; int cnt=0; int a[maxn]={0};//存储其所有因子 scanf("%d",&n); for(i=2;i<=n;i++) { while(n%i==0) { a[cnt++]=i; n/=i; } } for(i=0;i<cnt;i++) { if(i) printf(" "); printf("%d",a[i]); } printf("\n"); return 0; }
实现方法2:
我们要的其实是n的所有素数因子,所以我们只要预先用欧拉筛打个素数表,遍历的时候就只用遍历素数了,这样可以快一点,并且可以处理1e12以内的数。
#include <bits/stdc++.h> typedef long long ll; using namespace std; int prime[10000005]; int a[1000005]; bool vis[10000005]; int cnt=0; void primejudge(int n) { memset(vis,false,sizeof(vis)); vis[1]=true; int i,j; for(i=2;i<=n;i++) { if(!vis[i]) prime[cnt++]=i; for(j=0;j<cnt&&i*prime[j]<=n;j++) { vis[i*prime[j]]=true; if(i%prime[j]==0) break; } } } int main() { primejudge(10000005);//预处理了1e7以内的素数 ll n; int i,index=0; scanf("%lld",&n); for(i=0;i<cnt;i++) { while(n%prime[i]==0) { a[index++]=prime[i]; n/=prime[i]; } if(n==1) break; } if(n!=1) { a[index++]=n;//这一步的意思是。如果遍历到了1e7的素数,n还没有变为1,那么剩下的n一定是一个素数。(前提,n<1e12) } for(i=0;i<index;i++) { if(i) printf(" "); printf("%d",a[i]); } printf("\n"); return 0; }
以上是关于唯一分解定理的主要内容,如果未能解决你的问题,请参考以下文章