給定一正整數 n, 令σ(n) 表示 n 的所有正因數之和(含n). 所以完美數 σ(n) = 2*n
n = p1^n1 ... pr^nr, 其中 pi 為相異質數, 則
σ(n) = P1^(n1+1)/(p1-1)*P2^(n2+1)/(p2-1)*...*Pr^(nr+1)/(pr-1)
一開始只看到 n<=10^12,直接求和也才O(10^6),沒看到 t<=1001 , 哪就要 O(10^9) 吃了多次的 TLE
所以就要使用上述的 sum of divisors function σ(n),也就要建質數表 <=10^6 的質數共 78498個,最大 999983
所的解法如下
int main()
{
sieve(); // 篩法建質數表
int t;
ll n,r;
cin >> t;
while( t-- )
{
scanf("%lld",&n);
r=rof(n); // 求所有正因數和
if( 2*n==r ) puts( "perfect");
else if( 2*n>r ) puts( "deficient");
else puts( "abundant");
}
return 0;
}
給定一正整數 n, 令σ(n) 表示 n 的所有正因數之和(含n). 所以完美數 σ(n) = 2*n
n = p1^n1 ... pr^nr, 其中 pi 為相異質數, 則
σ(n) = P1^(n1+1)/(p1-1)*P2^(n2+1)/(p2-1)*...*Pr^(nr+1)/(pr-1)
一開始只看到 n<=10^12,直接求和也才O(10^6),沒看到 t<=1001 , 哪就要 O(10^9) 吃了多次的 TLE
所以就要使用上述的 sum of divisors function σ(n),也就要建質數表 <=10^6 的質數共 78498個,最大 999983
所的解法如下
int main()
{
sieve(); // 篩法建質數表
int t;
ll n,r;
cin >> t;
while( t-- )
{
scanf("%lld",&n);
r=rof(n); // 求所有正因數和
if( 2*n==r ) puts( "perfect");
else if( 2*n>r ) puts( "deficient");
else puts( "abundant");
}
return 0;
}
感謝指點~ 我分享一下我用到的東西
1.質數表建立
2.質因數分解
3.因數總合 ex: 2^4*3^2 = ( 2^0 + 2^1 + 2^2 + 2^3 + 2^4 ) * ( 3^0 +3^1 +3^2 )
4.σ(n) == 2*n->perfect number