约数个数定理

来源:互联网 发布:淘宝售后人工客服电话 编辑:程序博客网 时间:2024/05/22 01:52

约数个数定理

编辑
对于一个大于1正整数n可以分解质因数:
 
则n的正约数的个数就是
  
其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。

定理简证

编辑
首先同上,n可以分解质因数:n=p1^a1×p2^a2×p3^a3*…*pk^ak,
由约数定义可知p1^a1的约数有:p1^0, p1^1, p1^2......p1^a1 ,共(a1+1)个;同理p2^a2的约数有(a2+1)个......pk^ak的约数有(ak+1)个。
故根据乘法原理:n的约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1)。

例题

编辑
例题:正整数378000共有多少个正约数?
解:将378000分解质因数378000=2^4×3^3×5^3×7^1
由约数个数定理可知378000共有正约数(4+1)×(3+1)×(3+1)×(1+1)=160个。
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>#include<queue>using namespace std;long a[105];long b[105];long c[105];int cnt;void  getyue(long n){    cnt=0;    for(int i=2;i<=sqrt(n);i++)    {        if(n%i==0)        {            a[cnt++]=i;            n=n/i;            i--;        }    }    a[cnt]=n;}int getresult(){    int sum=0;    for(int i=0;i<=cnt;i++)    {        if(a[i]==a[i+1])        {            b[sum]++;        }        else{           b[sum]++;           sum++;        }    }    return sum;}int getac(){    int t=getresult();    int sum=1;    for(int i=0;i<t;i++)    {        sum=sum*(b[i]+1);    }    return sum;}int main(){    int t;    cin>>t;        while(t--){        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        long n;        cin>>n;        getyue(n);        int ac=getac();        cout<<ac<<endl;        cnt=0;        }    return 0;}

原创粉丝点击