*問い21 d(n) を n の真の約数の和と定義する. (真の約数とは n 以外の約数のことである. ) もし, d(a) = b かつ d(b) = a (a ≠ b のとき) を満たすとき, a と b は友愛数(親和数)であるという. 例えば, 220 の約数は 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 なので d(220) = 284 である. また, 284 の約数は 1, 2, 4, 71, 142 なので d(284) = 220 である. それでは10000未満の友愛数の和を求めよ. 解法 コードの中では1~nまでの約数を求める計算はsetYakusuu関数で簡単に方がついてます。 後は条件を満たすかどうか調べるだけです。 #include<stdio.h> const int up=10000; int memo[up+1]={0}; void setYakusuu(){ for(int i=1;i<=up;i++){ for(int j=2*i;j<=up;j+=i){ memo[j]+=i; } } } int main(){ setYakusuu(); int d,ans=0; for(int i=2;i<up;i++){ d=memo[i]; if(d<up&&memo[d]==i&&d!=i){ printf("%d %d\n",d,i); ans+=i; } } printf("%d",ans); }