原文链接:http://blog.csdn.net/grastyele/article/details/6678454
整数分解:
任何一个正整数都可以表示成素数的x次方之积,所以本题就被转化成了求n ^2的素因子个数;
先把n分解得到 n = p1^e1 * p2^e2 * ......*pr^er 其中p是< n 的素数那么n 的素因子, 则n的因子个数 k = (e1 + 1) * (e2 + 1) * (e3 + 1)*......
所以:n ^2的因子数是k = (2*e1+1) * (2*e2+1)* (2*e3+1)......
这个题还要注意一点就是当n是素数的时候,很显然 k *= 3,这样做得到的结果是题目要求的2倍
#include
<
stdio.h
>
#include < math.h >
#define max 50000
int num[max], prim[max];
int main()
{
int t, n, i, j, cnt, a, m, pim;
m = 0 ;
for (i = 1 ; i < max; ++ i)
{
num[i] = 1 ;
}
for (i = 2 ; i < max; ++ i) // 筛素数
{
if (num[i])
{
prim[m ++ ] = i;
for (j = i + i; j < max; j += i)
{
num[j] = 0 ;
}
}
}
scanf( " %d " , & t);
for (i = 1 ; i <= t; ++ i)
{
scanf( " %d " , & n);
cnt = 1 ;
for (j = 0 ; j < m; ++ j)
{
pim = ( int ) sqrt(n * 1.0 ) + 1 ;
if (prim[j] > pim)
{
break ;
}
a = 0 ;
while (n % prim[j] == 0 )
{
a ++ ;
n /= prim[j];
}
cnt *= ( 1 + 2 * a);
}
if (n > 1 ) // 当n是素数的时候
{
cnt *= 3 ;
}
printf( " Scenario #%d:\n " , i);
printf( " %d\n " , (cnt + 1 ) / 2 );
printf( " \n " );
}
return 0 ;
}
#include < math.h >
#define max 50000
int num[max], prim[max];
int main()
{
int t, n, i, j, cnt, a, m, pim;
m = 0 ;
for (i = 1 ; i < max; ++ i)
{
num[i] = 1 ;
}
for (i = 2 ; i < max; ++ i) // 筛素数
{
if (num[i])
{
prim[m ++ ] = i;
for (j = i + i; j < max; j += i)
{
num[j] = 0 ;
}
}
}
scanf( " %d " , & t);
for (i = 1 ; i <= t; ++ i)
{
scanf( " %d " , & n);
cnt = 1 ;
for (j = 0 ; j < m; ++ j)
{
pim = ( int ) sqrt(n * 1.0 ) + 1 ;
if (prim[j] > pim)
{
break ;
}
a = 0 ;
while (n % prim[j] == 0 )
{
a ++ ;
n /= prim[j];
}
cnt *= ( 1 + 2 * a);
}
if (n > 1 ) // 当n是素数的时候
{
cnt *= 3 ;
}
printf( " Scenario #%d:\n " , i);
printf( " %d\n " , (cnt + 1 ) / 2 );
printf( " \n " );
}
return 0 ;
}