プロジェクトオイラー問153

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20153
Problem 153 「ガウス整数の調べ上げ」 †
ガウス整数a+biのaが自然数かつ10^8までの自然数の約数になってるもののaの合計を答えよ。


とりあえず(a+bi)(a-bi)という組でしか約数になるものはないので何も考えず解いてみました。
計算時間1分。
3重ループ内側のcをもうちょっと簡単に計算できればOKなのだろうか?


#include<stdio.h>
#include<iostream>
#include<math.h> 

const int LIMIT=10000*10000; 

__int64 f(__int64 n){
	return n*(n+1)/2;
} 

int gcd ( int a, int b )
{
 int c;
 while ( a != 0 ) {
    c = a; a = b%a;  b = c;
 }
  return b;
}

int main(){
	__int64 ans=0;
	for(__int64 i=1;i<=LIMIT;i++){
		ans+=(LIMIT/i)*i;
	}
	std::cout<<ans<<"\n";
	
	
	for(int a=1;a*a<=LIMIT;a++){
		for(int b=1;a*a+b*b<=LIMIT;b++){
			if(gcd(a,b)!=1)continue;
			int n=a*a+b*b;
			int m=LIMIT/n;
			for(int c=1;c<=m;c++){
				ans+=(c*(m/c)+f(m/c))*a;
			}
		}
	}
	std::cout<<ans<<"\n";
}
最終更新:2016年01月15日 11:49