zoukankan      html  css  js  c++  java
  • BZOJ2190 欧拉函数

    题意: http://www.lydsy.com/JudgeOnline/problem.php?id=2190

    这个矩阵是对称的,因此只要算出上三角的一半就行了

    一开始不太好看,不妨让坐标从0开始:

    eg:对于N=6的情况,令起始点坐标为(0,0)。

    那么所有能看见的点就是:

    1,1  1,2  1,3  1,4  1,5  2,3  2,5  3,4  3,5  4,5  0,1

    容易发现除了带0的那个点之外,其他的点都满足gcd(x,y)=1

    这样问题就简单了,比bzoj2186那个题简单多了。直接累加欧拉函数就行,

    注意:1,1对角线上那个点算了两次,最后答案-1

       带0的点没记进去,最后答案+2

    所以ans=2*sum(phi[1..n-1])+2-1 

     1 #include "iostream"
     2 using namespace std;
     3 #define LL long long
     4 #define MMX 50010
     5 int phi[MMX],psum[MMX];
     6 LL n,ans;
     7 
     8 void calc_phi(int n)        //求1--n的欧拉函数,phi[i]=φ(i)
     9 {
    10     for (int i=2;i<=n;i++)
    11         phi[i]=0;
    12     phi[1]=1;
    13     for (int i=2;i<=n;i++)
    14         if (!phi[i])
    15             for (int j=i;j<=n;j+=i)
    16             {
    17                 if (!phi[j])    phi[j]=j;
    18                 phi[j]=phi[j]/i*(i-1);
    19             }
    20     psum[1]=1;
    21     for (int i=2;i<=n;i++)
    22         psum[i]=psum[i-1]+phi[i];
    23 }
    24 
    25 int main()
    26 {
    27     while (cin>>n)
    28     {
    29         calc_phi(n);
    30         ans=2*psum[n-1]+1;
    31         cout<<ans<<endl;
    32     }
    33 }
    View Code
  • 相关阅读:
    搭建LAMP及wordpress
    httpd2.4常用配置
    编译安装httpd 2.4
    https加密实现
    httpd常用配置
    源码编译安装bind
    安装mariadb二进制程序
    搭建互联网DNS构架
    搭建DNS服务
    主从及转发DNS搭建
  • 原文地址:https://www.cnblogs.com/pdev/p/4097916.html
Copyright © 2011-2022 走看看