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; }