「プロジェクトオイラー問72」の編集履歴(バックアップ)一覧に戻る

プロジェクトオイラー問72 - (2014/03/02 (日) 04:55:49) のソース

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2072

*Problem 72 「分数の数え上げ」 †
nとdを正の整数として, 分数 n/d を考えよう. n<d かつ HCF(n,d)=1 のとき, 真既約分数と呼ぶ.

d ≤ 8について真既約分数を大きさ順に並べると, 以下を得る:

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
この集合は21個の要素をもつことが分かる.

d ≤ 1,000,000について, 真既約分数の集合は何個の要素を持つか?


解法
オイラーのファイ関数をエラトステネスの篩風味に実装してみました。
今回はC++です。



 #include<stdio.h>
 #include<iostream>
 
 const int LIMIT=1000*1000;
 __int64 memo[LIMIT+1];
 
 
 int main(){
 	__int64 ans=0;
 	for(int i=2;i<=LIMIT;i++){
 		memo[i]=i;
 	}
 	for(int i=2;i<=LIMIT;i++){
 		if(memo[i]!=i)continue;
 		for(int j=1;j*i<=LIMIT;j++){
 			memo[i*j]=(memo[i*j]/i)*(i-1);
 		}
  	}
 	for(int i=2;i<=LIMIT;i++){
 		ans+=memo[i];
 	}
 	std::cout<<ans<<"\n";
 }