Problem 211
211 Divisor Square Sum
Problem 211 - Project Euler
約数関係の問題は、たいてい、因数分解・除算などは効率が良くないので、使えることが少ない。
では、どうするか?
ふるい。
#include <stdio.h> #include <stdlib.h> #include <math.h> #define N 64000000LL int main(){ long long u, c, i, j, *s; u = (long long) sqrt(N); c = 0; s = malloc((N+1)*sizeof(long long)); for(i=1;i<=u;i++){ s[i*i] += i*i; for(j=i+1;j<=N/i;j++) s[j*i] += i*i + j*j; } for(i=1;i<=N;i++){ j = floor(sqrt(s[i])); c += j*j==s[i] ? i: 0; } printf("%lld\n",c); }
まぁ、Haskellで書いてもいいけどメンドウ、どうせ、Cのほうが速いし、短い。