码迷,mamicode.com
首页 > 其他好文 > 详细

数论模板整理

时间:2017-08-05 09:49:48      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:pac   return   div   清空   情况   math   mat   log   oid   

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cstdlib>
  5 #include<cmath>
  6 #include<map>
  7 #include<iostream>
  8 using namespace std;
  9 typedef long long ll;
 10 #define pi  acos(-1.0)
 11 const int mod=1e9+7;
 12 
 13 
 14 const int maxn=1000007;
 15 bool is_prime[maxn];
 16 int prime[maxn];
 17 void AIsieve(int n){
 18     int cnt=0;
 19     memset(is_prime,1,sizeof(is_prime));
 20     is_prime[0]=is_prime[1]=0;
 21     for(int i=2;i<n;i++){
 22         if(is_prime[i]){
 23             prime[cnt++]=i;//保存素数
 24             for(int j=i*i;j<n;j+=i)//i*i开始进行了稍微的优化
 25                 prime[j]=0;//不是素数
 26         }
 27     }
 28     return ;
 29 }
 30 
 31 
 32 const int MAXN=3000001;
 33 int prime[MAXN];//保存素数
 34 bool vis[MAXN];//初始化
 35 int LSsieve(int n){
 36     int cnt=0;
 37     memset(vis,0,sizeof vis);
 38     for(int i=2;i<n;i++){
 39         if(!vis[i]) prime[cnt++]=i;
 40         for(int j=0;j<cnt&&i*prime[j]<n;j++){
 41             vis[i*prime[j]]=1;
 42             if(i%prime[j]==0)   break;
 43         }
 44     }
 45     return cnt;//返回小于n的素数的个数 
 46 }
 47 
 48 
 49 int phi[maxn];
 50 void phisieve(int n){
 51     for(int i=1;i<n;i++)  phi[i]=i;
 52     for(int i=2;i<n;i++)
 53         if(i==phi[i]) //此时i为素数
 54             for(int j=i;j<n;j+=i)  //j累加i
 55                 phi[j]=phi[j]/i*(i-1); //j有因子i,而且i是素数,正是欧拉函数
 56 }
 57 
 58 
 59 
 60 //将求素数和欧拉函数值都线性解出
 61 int prime[MAXN];//保存素数
 62 bool vis[MAXN];//初始化
 63 int phi[MAXN];//欧拉函数
 64 void Lphisieve(int n){
 65     int cnt=0;
 66     for(int i=2;i<n;i++){
 67         if(!vis[i]){
 68             prime[cnt++]=i;
 69             phi[i]=i-1;// if p is prime,then phi[i]=i-1
 70         }
 71         for(int j=0;j<cnt&&i*prime[j]<n;j++){
 72             int k=i*prime[j];
 73             vis[k]=true;
 74             if(i%prime[j]==0){
 75                 phi[k]=phi[i]*prime[j];
 76                 break;
 77             }
 78             else   phi[k]=phi[i]*(prime[j]-1);
 79         }
 80     }
 81 }
 82 
 83 //莫比乌斯函数一般筛法
 84 int mu[1000020];
 85 void sievemu(int n){
 86     mu[1]=1;
 87     for(int i=1;i<=n;i++){
 88         for(int j=i+i;j<=n;j+=i){
 89             mu[j]-=mu[i];
 90         }
 91     }
 92 }
 93 
 94 
 95 //莫比乌斯函数线性筛法
 96 const int maxn=60000+5;
 97 bool vis[maxn];
 98 int prime[maxn],mu[maxn];
 99 void init_mu(int n){
100     int cnt=0;
101     mu[1]=1;
102     for(int i=2;i<n;i++){
103         if(!vis[i]){
104             prime[cnt++]=i;
105             mu[i]=-1;
106         }
107         for(int j=0;j<cnt&&i*prime[j]<n;j++){
108             vis[i*prime[j]]=1;
109             if(i%prime[j]==0)   {mu[i*prime[j]]=0;break;}
110             else { mu[i*prime[j]]=-mu[i];}
111         }
112     }
113 }
114 
115 ll mod_pow(ll x,ll n,ll p){
116     ll res=1;
117     while(n>0){
118         if(n&1)    res=res*x%p;
119         x=x*x%p;
120         n>>=1;
121     }
122     return res;
123 }
124 
125 map<ll,int>mp;
126 ll bsgs(ll a,ll b,ll c){
127     mp.clear();//清空map
128     ll tmp,m=ceil(sqrt(c));
129     //等于0的情况
130     tmp=b%c;
131     mp[tmp]=0;
132     for(int j=1;j<=m;j++){
133         tmp=tmp*a%c;
134         mp[tmp]=j;
135     }
136     tmp=1;
137     ll t=mod_pow(a,m,c);
138     for(int i=1;i<=m;i++){
139         tmp=tmp*t%c;
140         if(mp[tmp]) return i*m-mp[tmp];
141     }
142     return -1;
143 }
144 //sqrt(n)求欧拉函数值
145 ll euler_phi(int n){
146     int res=n;
147     for(int i=2;i*i<=n;i++){
148         if(n%i==0){
149             res=res/i*(i-1);
150             while(n%i==0) n/=i;
151         }
152     }
153     if(n!=1) res=res/n*(n-1);
154     return res;
155 }
156 
157 ll inv(int x,int mod){
158     return mod_pow(x,mod-2,mod);
159 }
160 
161 ll extgcd(ll a,ll b,ll &x,ll &y){
162     ll d=a;
163     if(b)   d=extgcd(b,a%b,y,x),y-=a/b*x;
164     else  x=1,y=0;
165     //return (x+b)%b;
166     return d;
167 };

 仍然不懂的地方:线性筛的原理;莫比乌斯普通筛法的证明

数论模板整理

标签:pac   return   div   清空   情况   math   mat   log   oid   

原文地址:http://www.cnblogs.com/elpsycongroo/p/7288380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!