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
  • 相关阅读:
    tomcat 项目部署环境变量配置
    .net framework 4.5.1( Installation failed with error code: (0x80070643), "安装时发生严重错误 " (Elapsed time: 0 00:04:49).)
    关于Excel2003行数(65535)和列数(255)限制问题解决
    收到一个Offer
    面试经验--Lowe Profero
    读书计划
    面试经验--IRDeto
    面试经验--普华永道
    .NET面试基础知识之序列化(Serialize)(四)
    .NET面试基础知识之序列化(Serialize)(三)
  • 原文地址:https://www.cnblogs.com/lmlyzxiao/p/4956185.html
Copyright © 2011-2022 走看看