题意:
求一个数因子个数(不包括1)
思路:
求每一个素因子出现的次数,然后每个次数+1相乘就是n的因子个数。不会出现重复,因为任意个素数相乘不会等于素数。
还运用了一个优化,具体意思是对于任意一数n,他的素因子大于sqrt(n)的不会超过一个。如果有两个素因子大于sqrt(n),明显不成立。
正好符合题目数据。
#include <iostream>
#include<stdio.h>
#include<cmath>
#define ll long long
using namespace std;
ll t,ans,len,n,top,ant,prime[1100000];
bool isprime[1100000];
void check()
{
for(int i=2; i<1100000; i++)
{
if(isprime[i]==0)
{
prime[ant++]=i;
for(int j=2*i; j<1100000; j+=i)
isprime[j]=1;
}
}
}
int main()
{
scanf("%lld",&t);
check();
while(t--)
{
scanf("%lld",&n);
len=sqrt(n);
ans=1;
ll sum=0;
for(int i=0; prime[i]<=len&&n!=1; i++)
{
sum=0;
while(n%prime[i]==0)
{
sum++;
n/=prime[i];
}
ans*=sum+1;
}
if(n!=1)
ans*=2;
printf("Case %lld: %lld\n",++top,--ans);
}
return 0;
}