void euler()  
{  
    for(int i=2;i<maxn;i++){  
        if(!E[i])  
        for(int j=i;j<maxn;j+=i){  
            if(!E[j])E[j]=j;  
            E[j]=E[j]/i*(i-1);  
        }  
    }  
}
欧拉函数
int euler(int n)
{
    int ans=1;
    for(int i=0; p[i]<=n&&i<k; ++i)
    {
        int cnt=0;
        while(n%p[i]==0)
        {
            n/=p[i];
            cnt++;
        }
        ans*=(cnt+1);
    }
    if(n>1)ans*=2;
    return ans;
}
唯一分解定理求因子个数
void prime()
{
    for(int i=2;i<MAXN;++i)
    {
        if(!pri[i])p[k++]=i;
        for(int j=i<<1;j<MAXN;j+=i)
            if(!pri[j])pri[j]=1;
    }
}
线性筛
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4  
 5 using namespace std;
 6  
 7 int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法
 8 {
 9     if(b==0)
10     {
11         x=1;y=0;
12         return a;  //到达递归边界开始向上一层返回
13     }
14     int r=exgcd(b,a%b,x,y);
15     int temp=y;    //把x y变成上一层的
16     y=x-(a/b)*y;
17     x=temp;
18     return r;     //得到a b的最大公因数
19 }
扩展欧几里得
posted on 2019-10-04 10:07  megadeth  阅读(143)  评论(0编辑  收藏  举报