zoukankan      html  css  js  c++  java
  • 线性筛三合一,强大O(n)

    校内CJOJ2395by Jesse Liu

    筛法三合一 Euler、Möbius、Prime函数

    基于数论的积性函数

    gcd(a,b)=1  则  ƒ(ab)=ƒ(a)ƒ(b)

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <vector>
     7 #include <cmath>
     8 #include <queue>
     9 #include <map>
    10 #include <set>
    11 using namespace std;
    12 #define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
    13 inline void read(int &ans){
    14   ans=0;char x=getchar();int f=0;
    15   while(x<'0'||x>'9'){if(x=='-')f=1;x=getchar();}
    16   while(x>='0'&&x<='9')ans=ans*10+x-'0',x=getchar();
    17   if(f)ans=-ans;
    18 }
    19  
    20 const int maxn=(int)1e7+10;
    21 int phi[maxn],mu[maxn],p[maxn],flag[maxn],cnt;
    22 void sieve(int n){
    23   mu[1]=phi[1]=1;
    24   for(int i=2;i<=n;i++){
    25     if(!flag[i])p[++cnt]=i,mu[i]=-1,phi[i]=i-1;
    26     for(int j=1;j<=cnt && i*p[j]<=n;j++){
    27       flag[i*p[j]]=1;
    28       if(i%p[j]==0){mu[i*p[j]]=0,phi[i*p[j]]=phi[i]*p[j];break;}
    29       mu[i*p[j]]=-mu[i],phi[i*p[j]]=phi[i]*(p[j]-1);
    30     }
    31   }
    32 }
    33  
    34 int main(){
    35   sieve((int)1e7);
    36   int T,op,n;
    37   for(read(T);T--;){
    38     read(op),read(n);
    39     printf("%d\n",op==1?p[n]:op==2?mu[n]:phi[n]);
    40   }
    41   return 0;
    42 }
    sieve

    进一步学习的建议,Jesse Liu

    ~~Jason_liu O(∩_∩)O
  • 相关阅读:
    Git常用命令整理
    JavaScript常用代码书写规范
    程序猿常用英语单词汇总
    15个常用的javaScript正则表达式
    [Java复习] 服务注册中心 (Eureka, Zookeeper)
    [Java复习] 面试突击
    [Java复习] 面试突击
    [Java复习] 面试突击
    [Java复习] Spring Cloud
    [Java复习] 微服务
  • 原文地址:https://www.cnblogs.com/JasonCow/p/6536381.html
Copyright © 2011-2022 走看看