约数个数定理
对于一个大于1正整数n可以
分解质因数:
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D231/sign=e19b382db04543a9f11bfdcf2f168a7b/a8ec8a13632762d0a5814266a7ec08fa503dc6a8.jpg)
则n的
正约数的个数就是
。
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D316/sign=ca4b36d4d243ad4ba22e40c1b4035a89/8ad4b31c8701a18b94aed93e9d2f07082838fe7e.jpg)
其中a
1、a
2、a
3…a
k是p
1、p
2、p
3,…p
k的指数。
#include <iostream>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
struct node
{
int n;
int num;
};
node prime[200000];
ll isPrime(ll N){
int len = sqrt(N);
int flag = 0;
for(int i=2;i<=len;i++)
{
if(N%i==0)
{
flag =1;
return 0;
}
}
if(!flag)
return 1;
}
void init()
{
int num = 0;
for(int i=2;i<100000;i++)
if(isPrime(i))
prime[num++].n=i;
}
int n_pr(int n)
{
int i, k = 1;
for(i=0; n!= 1;i++)
{
if(n % prime[i].n == 0)
prime[i].num=1;
while(n % prime[i].n == 0)
{
prime[i].num++;
n/=prime[i].n;
}
if(prime[i].num != 0)
k *= prime[i].num;
}
return k;
}
int main()
{
init();
int n, m;
while(~scanf("%d", &n))
{
while(n--)
{
scanf("%d", &m);
for(int i=0;i<m;i++)
prime[i].num=0;
printf("%d ", n_pr(m));
}
printf("\n");
}
return 0;
}