9度OJ 教程56 约数的个数(感谢炮神的约数公式)

九度OJ 教程56 约数的个数(感谢炮神的约数公式)

题目地址:http://ac.jobdu.com/problem.php?cid=1040&pid=55


//九度OJ 教程56 约数的个数(感谢炮神的约数公式)
//http://ac.jobdu.com/problem.php?cid=1040&pid=55
//leizh007大神的约数公式,借鉴写的代码,感谢炮神
#include <stdio.h>
#define MAXS 100004
int mark[MAXS]={0},count=0;
long prime[MAXS];
int main()
{
	long i,j,k,n,ans,a;
	for(i=2;i<MAXS;i++)
	{
		if(mark[i])continue;
		prime[++count]=i;
		for(j=i*i;j<MAXS;j+=i)mark[j]=1;
	}
	while(~scanf("%ld",&n))
	{
		for(i=1;i<=n;i++)//纯粹为了读n次数,没实际用处。
		{
			ans=1;
			scanf("%ld",&a);
			for(j=1;j<count;j++)
			{
				k=1;
				while(a%prime[j]==0)
				{
					k++;
					a/=prime[j];
				}
				ans*=k;//牛的必然牛,排列吧组合吧!
				if(a==1)break;
			}
			if(a!=1)ans*=2;//牛的必然牛,防止另一个素数的出现。
			printf("%ld\n",ans);
		}
	}
	return 0;
}