zoukankan      html  css  js  c++  java
  • poj 3478 poj 3090(欧拉函数的应用)

    3478题目意思是Farey序列是由一系列不能约分的分数a/b(0<a<b<=n且gcd(a,b)=1)按照递增的顺序组成的,然后给出了Fn的前几项,让你计算Fn中有多少个分数.

    很明显Fn中的数的个数就是分别与(2,3,4.....n-1,n)互质的数的个数的和。也就是求欧拉函数的前n项和。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <stack>
     5 #include <queue>
     6 #include <map>
     7 #include <algorithm>
     8 #include <vector>
     9 
    10 using namespace std;
    11 
    12 const int maxn = 1000000;
    13 
    14 typedef long long LL;
    15 
    16 LL phi[maxn+1];
    17 
    18 void init()
    19 {
    20     LL i,j;
    21     for(i=1;i<=maxn;i++) phi[i] = i;
    22     for(i=2;i<=maxn;i+=2) phi[i]/=2;
    23     for(i=3;i<=maxn;i+=2){
    24         if(phi[i] == i){
    25             for(j=i;j<=maxn;j+=i){
    26                 phi[j] = phi[j]/i*(i-1);
    27             }
    28         }
    29     }
    30     for(i=3;i<maxn+1;i++){
    31         phi[i]+=phi[i-1];
    32     }
    33 }
    34 
    35 int main()
    36 {
    37      init();
    38      int n;
    39      while(cin>>n&&n){
    40         printf("%lld
    ",phi[n]);
    41      }
    42 
    43     return 0;
    44 }
    View Code

     3090的情况跟3478差不多,但是要注意的可见点的情况是以x=y这条直线对称的,所以最后的答案是2*phi[n]+1,x=y也算。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <stack>
     5 #include <queue>
     6 #include <map>
     7 #include <algorithm>
     8 #include <vector>
     9 
    10 using namespace std;
    11 
    12 const int maxn = 1000;
    13 
    14 typedef long long LL;
    15 
    16 LL phi[maxn+1];
    17 
    18 void init()
    19 {
    20     LL i,j;
    21     for(i=1;i<=maxn;i++) phi[i] = i;
    22     for(i=2;i<=maxn;i+=2) phi[i]/=2;
    23     for(i=3;i<=maxn;i+=2){
    24         if(phi[i] == i){
    25             for(j=i;j<=maxn;j+=i){
    26                 phi[j] = phi[j]/i*(i-1);
    27             }
    28         }
    29     }
    30     for(i=2;i<maxn+1;i++){
    31         phi[i]+=phi[i-1];
    32     }
    33 }
    34 
    35 int main()
    36 {
    37      init();
    38      int n;
    39      int cas;
    40      cin>>cas;
    41      for(int i=1;i<=cas;i++){
    42         cin>>n;
    43         printf("%d %d %d
    ",i,n,2*phi[n]+1);
    44      }
    45 
    46     return 0;
    47 }
    View Code
  • 相关阅读:
    结构和联合
    字符串、字符和字节
    数组
    函数
    指针
    操作符和表达式
    语句
    数据
    TinyXML2 使用
    是否忘记了向源中添加“#include "StdAfx.h"”?
  • 原文地址:https://www.cnblogs.com/lmlyzxiao/p/4956185.html
Copyright © 2011-2022 走看看