project euler 21~25

21. d(n)をnの真の約数の和と定義する。(真の約数とはn以外の約数のことである。)
もし、d(a) = b かつ d(b) = a (a ≠ b)を満たすとき、aとbは友愛数(親和数)であるという。
それでは10000未満の友愛数の合計を求めよ。

#define smax 10000
int a[smax] = {};

int yakusu(int a){
   int sum=0;
   for(int i=1;i<a;i++){
      if(a%i == 0) sum+= i;
   }
   return sum;
}

int solve(int a){
   if(yakusu(yakusu(a)) == a && yakusu(a) != a) return a;
   else return 0;
}

int main(void){
   int res=0;
   for(int i=1;i<smax;i++){
      res += solve(i);
   }
   cout << res << endl;
   return 0;
}

22. 名前の書かれたテキストファイルが与えられるのでそれをソートする。
そして名前の英単語*その名前の出現番の値をすべてたす。
例えば ABOUTが10番目にあった場合、Aはindex1でBはindex2なので1+2+15+21+20 = 49で10番目なので値は49*10=490となる

mapで名前のソートしてあとは実装だけです

int main(void){
   string str;
   char c[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
   map<string,int> ma;
   while(cin >> str){
      ma[str]++;
   }
   ll sum = 0;
   int s=1;
   for(map<string,int>::iterator it = ma.begin();it != ma.end();it++){
      int str_s = 0;
      for(int i=0;i<it->first.size();i++){
         for(int j=0;j<26;j++){
            if(it->first[i] == c[j]){
               str_s += j+1;
               break;
            }
         }
      }
      sum += str_s*s;
      s++;
   }
   cout << sum << endl;
   return 0;
}

23.

24. 0~9までの値を辞書順に並べた時の100万番目の値をだす
next_permutationを使う

int main(void){
   vector<int> ve(10);
   rep(i,10) ve[i] = i;
   int cnt=1;
   do{
      if(cnt == 1000000){
         rep(i,10)
            cout << ve[i];
         cout << endl;
      }
      cnt++;
   }while(next_permutation(ALL(ve)));
   return 0;
}

25.フィボナッチ数列で初めて1000桁になる時のindexを出力
boost/multiprecisionで4096bit指定で解きました

#include<boost/lexical_cast.hpp>
#include<boost/multiprecision/cpp_int.hpp>
#define smax 5000

using namespace boost;
using namespace boost::multiprecision;


typedef mp_number<cpp_int_backend<4096, false, void>, false> uint_4096;

uint_4096 dp[smax];

int main(void){
   dp[0] = dp[1] = 1;
   for(int i=2;i<smax;i++){
      dp[i] = dp[i-1]+dp[i-2];
      string str = lexical_cast<string>(dp[i]);
      if(str.size() == 1000){
         cout << i+1 << endl;
         break;
      }
   }
   return 0;
}