欧拉函数计算及打表

 1 #include<bits/stdc++.h>
 2 #define ll long long 
 3 #define scan(i) scanf("%d",&i)
 4 #define scand(i) scanf("%lf",&i)
 5 #define scanl(i) scanf("%lld",&i)
 6 #define f(i,a,b) for(int i=a;i<=b;i++) 
 7 #define pb(i) push_back(i)
 8 #define ppb pop_back()
 9 #define pf printf
10 #define dbg(args...) cout<<#args<<" : "<<args<<endl;
11 using namespace std;
12 #define Max 100001
13 int euler[Max];
14 void init(){
15      euler[1]=1;
16      for(int i=2;i<Max;i++)
17        euler[i]=i;
18      for(int i=2;i<Max;i++)
19         if(euler[i]==i)
20            for(int j=i;j<Max;j+=i)
21               euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
22 }
23 //用通式算的
24 int Euler(int n){ //返回euler(n)
25     int res=n,a=n;
26     for(int i=2;i*i<=a;i++){
27         if(a%i==0){
28             res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
29             while(a%i==0) a/=i;
30         }
31     }
32     if(a>1) res=res/a*(a-1);
33     return res;
34 } 
35 int eulercal(int n){
36     int ret=n;
37     for(int i=2;i<=sqrt(n);i++)
38     if(n%i==0){
39         ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
40         while(n%i==0) n/=i;
41      }
42     if(n>1) ret=ret/n*(n-1);
43     return ret;
44 }
45 int main()
46 {    init();
47     int a;
48     ll ans=0;
49     scan(a);
50     f(i,2,a){
51         ans+=euler[i];
52     }
53     pf("%lld",ans);
54 }

 

posted @ 2019-08-24 15:54  Lovaer  阅读(1346)  评论(0编辑  收藏  举报