• Poj 2478-Farey Sequence 欧拉函数,素数,线性筛


    Farey Sequence
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 14291   Accepted: 5647

    Description

    The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. The first few are 
    F2 = {1/2} 
    F3 = {1/3, 1/2, 2/3} 
    F4 = {1/4, 1/3, 1/2, 2/3, 3/4} 
    F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5} 

    You task is to calculate the number of terms in the Farey sequence Fn.

    Input

    There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 106). There are no blank lines between cases. A line with a single 0 terminates the input.

    Output

    For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn. 

    Sample Input

    2
    3
    4
    5
    0

    Sample Output

    1
    3
    5
    9

    Source

    POJ Contest,Author:Mathematica@ZSU
     
    题解:
    直接欧拉函数,求个前缀和,就好了。
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<algorithm>
     7 using namespace std;
     8 #define LL long long
     9 LL qz[1000010];
    10 int phi[1000010],prime[80010],tot;
    11 bool vis[1000010];
    12 void Eular()
    13 {
    14     int i,j;
    15     phi[1]=1;tot=0;
    16     for(i=2;i<=1000000;i++)
    17     {
    18         if(vis[i]==false)
    19         {
    20             prime[++tot]=i;
    21             phi[i]=i-1;
    22         }
    23         for(j=1;j<=tot&&prime[j]*i<=1000000;j++)
    24         {
    25             vis[prime[j]*i]=true;
    26             if(i%prime[j]==0)
    27             {
    28                 phi[prime[j]*i]=phi[i]*prime[j];
    29                 break;
    30             }
    31             phi[prime[j]*i]=phi[prime[j]]*phi[i];
    32         }
    33     }
    34 }
    35 void Qz()
    36 {
    37     for(int i=1;i<=1000000;i++)qz[i]=qz[i-1]+phi[i];
    38 }
    39 int main()
    40 {
    41     int n;
    42     Eular();
    43     //for(int i=1;i<=100;i++)printf("%d ",phi[i]);
    44     //printf("
    ");
    45     Qz();
    46     while(1)
    47     {
    48         scanf("%d",&n);
    49         if(n==0)break;
    50         printf("%lld
    ",qz[n]-1);
    51     }
    52     return 0;
    53 }
    View Code
  • 相关阅读:
    Java进阶7并发优化4——JDK并发数据结构
    Java 进阶7 并行优化 JDK多任务执行框架技术
    Java进阶7 并发优化2 并行程序设计模式
    Java 进阶7 并发优化 1 并行程序的设计模式
    Java 进阶6 异常处理的陷阱
    Algorithm3: 获得一个int数中二进制位为1 的个数
    Algorithm2: 重复查过半数的元素
    Algorithm1: 全排列
    Java进阶5 面向对象的陷阱
    Java进阶2 数组内存和对象的内存管理知识
  • 原文地址:https://www.cnblogs.com/Var123/p/5288048.html
Copyright © 2020-2023  润新知