数论 辗转相除法 扩展欧几里德算法 素数 快速幂
来源:互联网 发布:webapi 数据库 编辑:程序博客网 时间:2024/04/29 11:26
一.辗转相除法
int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}
二.扩展欧几里德算法
int extgcd(int a,int b,int &x,int &y){ int d=a; if(b){ d=extgcd(b,a%b,y,x); y-=(a/b)*x; } else{ x=1;y=0; } return d;}
三.素数
bool is_prime(int n){ for(int i=2;i*i<=n;++i) if(nn%i==0) return 0; return n!=1;}//约数枚举vector<int> divisor(int n){ vector<int> res; for(int i=1;i*i<=n;++i){ if(n%i==0){ res.push_back(i); if(i!=n/i) res.push_back(n/i); } } return res;}//整数分解map<int,int> prime_factor(int n){ map<int,int> res; for(int i=2;i*i<=n;++i){ while(n%i==0){ ++res[i]; n/=i; } } if(n!=1) res[n]=1; return res;}
埃氏筛法
int prime[MXN];bool is_prime[MXN];int sieve(int n){ int p=0; for(int i=0;i<=n;++i) is_prime[i]=true; is_prime[0]=is_prime[1]=false; for(int i=2;i<=n;++i){ if(is_prime[i]){ prime[p++]=i; for(int j=2*i;j<=n;j+=i) is_prime[j]=false; } } return p;}
bool is_prime[MXL];bool is_prime_small[MX_SQRT_B];//对区间[a,b)内的整数执行筛法,is_prime[i-a]=true<=>i是素数void segment_sieve(LL a,LL b){ for(int i=0;(LL)i*i<b;++i) is_prime_small[i]=true; for(int i=0;i<b-a;++i) is_prime[i]=true; for(int i=2;(LL)i*i<b;++i){ if(is_prime_small[i]){ for(int j=2*i;(LL)j*j<b;j+=i) is_prime_small[j]=false;//筛[2,sqrt(b)) for(LL j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;//筛[a,b) } }}//(a+i-1)/i作用相当于ceil,不足往上加
快速幂
LL mod_pow(LL x,LL n,LL mod){ LL res=1; while(n>0){ if(n&1) res=res*x%mod; x=x*x%mod; n>>=1; } return res;}