#12110: sum of divisors function


p3a_owhj (阿普二信)

學校 : 不指定學校
編號 : 39897
來源 : [36.227.79.178]
最後登入時間 :
2024-06-04 22:09:36
c204. 13194 - DPA Numbers II -- UVa13194 | From: [101.15.64.61] | 發表日期 : 2017-06-03 01:14

給定一正整數 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;
}

 
#12643: Re:sum of divisors function


game131452777 (deeee)

學校 : 長庚大學
編號 : 23687
來源 : [114.25.172.177]
最後登入時間 :
2020-04-19 22:29:16
c204. 13194 - DPA Numbers II -- UVa13194 | From: [61.228.173.18] | 發表日期 : 2017-09-01 17:22

給定一正整數 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



 
ZeroJudge Forum