2014年3月23日日曜日

プロジェクトオイラー Problem 72 「分数の数え上げ」 †

Problem 72 「分数の数え上げ」 

ndを正の整数として, 分数 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について, 真既約分数の集合は何個の要素を持つか?

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




解法
2~100万=n Σオイラーのファイ関数(n)が答えです。
エラトステネスの篩もどきで計算が終わります。


#include<stdio.h>
#include<iostream>
const int LIMIT=1000*1000;
int memo[LIMIT+1]={0};

int main(){
      __int64 ans=0;
     
      for(int i=2;i<=LIMIT;i++){
            if(memo[i]!=0){
                  ans+=memo[i];
                  continue;
            }else{
                  ans+=i-1;
            }
            for(int j=i+i;j<=LIMIT;j+=i){
                  if(memo[j]==0)memo[j]=j;
                  memo[j]=(memo[j]/i)*(i-1);
            }
      }
      std::cout<<ans<<"\n";
}

0 件のコメント:

コメントを投稿