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

    洛谷P2158

    欧拉函数

    在数论,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(因此φ(1)=1)。此函数以其首名研究者欧拉命名(Euler's totient function),它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。

    简单来说欧拉函数就是求从1到n-1中有多少个数与n互质。

    欧拉函数的模板

     1 int a[maxn];
     2 void euler()
     3 {
     4     for(int i=1;i<=maxn;i++)
     5         a[i]=i;
     6         a[1]=0;
     7         for(int i=1;i<=maxn;i++)
     8         {
     9             if(a[i]==i)
    10             {
    11              for(int j=i;j<=maxn;j+=i)
    12              a[j]=a[j]/i*(i-1);    
    13             }
    14         }
    15 }

    应用

    洛谷这道题,简单来说就是给一个N*N的矩阵,由左下角这个点可以和其他的点连多少条线,其中任意两条线不能交叉。我们很容易可以想到用斜率来处理,因为只要两条线的斜率不同他们就不会交叉,我们可以以左下角为原点建立坐标系,横纵坐标都为0到N-1,那么我们可以很容易得出如果一个点的坐标互质,那么它就满足题意,例如在4*4的矩阵中满足题意的有(1,0)(0,1)(1,1)(2,1)(1,2)(3,1)(1,3)(3,2)(2,3),并且因为对称关系,横纵坐标轴以及对称轴上的3个点我们做特殊处理,那么我们可以看到所有满足题意的点的横纵坐标都是互质的,那么我们只要根据对称 ,统计这样的数有多少个就可以了

     1 #include <iostream>
     2 #include <cstring>
     3 #include <string>
     4 #include <algorithm>
     5 #include <queue>
     6 #include <stack>
     7 #include <stdio.h>
     8 #include <cmath>
     9 #include <string.h>
    10 
    11 using namespace std;
    12 #define ll long long
    13 #define maxn 40005
    14 static const int WHITE=0;
    15 static const int GRAY=1;
    16 static const int BLACK=2;
    17 static const int INF=(1<<20);
    18 int a[maxn];
    19 void euler()
    20 {
    21     for(int i=1;i<=maxn;i++)
    22         a[i]=i;
    23         a[1]=0;
    24         for(int i=1;i<=maxn;i++)
    25         {
    26             if(a[i]==i)
    27             {
    28              for(int j=i;j<=maxn;j+=i)
    29              a[j]=a[j]/i*(i-1);    
    30             }
    31         }
    32 }
    33 int main()
    34 {
    35   freopen("C:\Users\16599\Desktop\in.txt","r",stdin);
    36   int N,ans=0;
    37   cin>>N;
    38   euler();
    39   for(int i=1;i<=N-1;i++)
    40   {
    41     ans+=a[i]*2;
    42   }
    43   if(N==1)
    44   cout<<"0"<<endl;
    45   else
    46   cout<<ans+3<<endl;
    47   return 0;
    48 }
  • 相关阅读:
    在字符串中,找出第一个不重复的字符
    servlet/filter/listener/interceptor区别与联系
    Java基础--泛型
    Java基础--访问权限控制符
    Comparable与Comparator的区别
    表示层设计模式:Intercepting Filter(截取筛选器)模式
    Java多线程:线程同步与关键字synchronized
    Java多态-如何理解父类引用指向子类对象
    android 垂直 SeekBar 源代码(VerticalSeekBar)[转]
    回调接口
  • 原文地址:https://www.cnblogs.com/zlhdbk/p/11545921.html
Copyright © 2011-2022 走看看