关于约数定理

套用百度的话:
对于一个大于1正整数n可以分解质因数n = p1^a1*p2^a2*......pk^ak
则n的正约数个数就是
  (a1+1)*(a2+1)*......*(ak+1)
其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。
用这个定理求一个数的约数个数是非常快的,贴出一道训练题目:
hdu 1492 -求约数的个数
贴出代码:
//约数定理的
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define ll long long

int main()
{
   // freopen("s.cpp","r",stdin);

    ll n;
    while(scanf("%lld",&n) != EOF)
    {
        if(!n) break;

        ll sum = 1;
        /* x = p1^a1*p2^a2*p3^a3...pk^ak
        yueshu = (a1+1)*(a2+1)*...*(ak+1)*/
        for(ll i = 2; i*i <= n; i++){
            int cou = 0;
            if(n%i==0){
                cou = 1;
                n /= i;
                while(n%i==0){
                    cou++;
                    n /= i;
                }
            }
            if(cou != 0){
                sum = sum*(cou+1);
            }
        }
        if(n != 1){
            sum = sum*2;
        }
        if(sum==1 && n==1){
            sum = 1;
        }
        printf("%lld\n",sum);
    }
    return 0;
}


你可能感兴趣的:(c++编程,ACM的常用算法)