とりあえず(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