hdu1492(约数个数定理)

时间:2021-11-10 03:40:02

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1492

这里先讲一下约数个数定理:

对于正整数x,将其质因分解为 x = pow(p1, a) * pow*(p2, b) * pow(p3, c) * ...

则其约数个数为:num(x) = (a+1) * (b+1) * (c+1) *...

推导:

由约数定义可知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)。

那么这道题直接代这个公式好啦~

题意:

给出一个64bit的数,求它的约数的个数;

代码:

 #include <iostream>
#include <stdio.h>
#define ll long long
using namespace std; int main(void){
ll n;
while(scanf("%lld", &n)&&n){
int a[]={, , , };
int b[]={, , , };
for(int i=; i<; i++){
while(n%b[i]==){
a[i]++;
n/=b[i];
}
}
printf("%d\n", a[]*a[]*a[]*a[]);
}
return ;
}