[模板][数论][gcd+exgcd+sieve+power+euler_phi+euler_table+inv]
2016-11-14 22:14
344 查看
NOIP临近,,写写模板。。。
求逆元:
扩展欧几里得求逆元
适用范围:常数小,适合单个求逆元
限制:gcd(a,n)==1
费马小定理求逆元
适用范围:若mod是,inv=a^(mod-2)
否则inv=a^(phi(mod)-1),,所有前提条件,a,与mod互素。
线性求逆元
没有限制,,表示爱上线性求逆元了。。
gcd模板
筛法求素数
单数欧拉函数
求1-n的欧拉函数
O(nloglogn)
快速幂
差不多了,还有些以后再说吧。。。
求逆元:
扩展欧几里得求逆元
适用范围:常数小,适合单个求逆元
限制:gcd(a,n)==1
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define FROP "inv" #define LL long long using namespace std; int n=100,mod=1e9+7,inv[105]; void exgcd(int a,int b,int& d,int &x,int &y) { if(!b){d=a;x=1;y=0;} else {exgcd(b,a%b,d,y,x);y-=x*(a/b);} } int main() { freopen(FROP".out","w",stdout); for(int i = 1; i <= n; i++) { int d,x,y; exgcd(i,mod,d,x,y);//i mod mod 的逆元 inv[i]=(x%mod+mod)%mod; } for(int i = 1; i <= n; i++) printf("%d,",inv[i]); return 0; }
费马小定理求逆元
适用范围:若mod是,inv=a^(mod-2)
否则inv=a^(phi(mod)-1),,所有前提条件,a,与mod互素。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define FROP "inv" #define LL long long using namespace std; int n=100,mod=1e9+7,inv[105]; int euler_phi(int n) { int ans=n; int m= sqrt(n+0.5); for(int i = 2; i <= m; i++)if(n % i==0) { ans=ans/i*(i-1); while(n%i==0)n/=i; } if(n>1)ans=ans/n*(n-1); return ans; } int power(int a,int b) { if(!b)return 1; if(b==1)return a; int p=power(a,b/2); p=(LL)p*p%mod; if(b%2)return p*a%mod; return p; } int main() { freopen(FROP".out","w",stdout); int eul=euler_phi(mod); for(int i= 1; i <= 100; i++) { printf("%d,",power(i,eul-1)); } return 0; }
线性求逆元
没有限制,,表示爱上线性求逆元了。。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define FROP "inv" #define LL long long using namespace std; int n=100,mod=1e9+7,inv[105]; int main() { freopen(FROP".out","w",stdout); inv[1]=1; for(int i = 2; i <= n; i++) inv[i]=(LL)(mod-mod/i)*inv[mod%i]%mod; for(int i = 1;i <= n; i++) printf("%d,",inv[i]); return 0; }
gcd模板
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
筛法求素数
void sieve(int n) { int m = sqrt(n+0.5); for(int i = 2; i <= m; i++)if(!vis[i]) for(int j = i*i; j <= n; j+=i)vis[j]=1; } int main() { freopen(FROP".in","r",stdin); freopen(FROP".out","w",stdout); sieve(100); for(int i = 1;i <= n; i++) if(!vis[i])printf("%d,",i); return 0; }
单数欧拉函数
int euler_phi(int n) { int ans=n; int m= sqrt(n+0.5); for(int i = 2; i <= m; i++)if(n % i==0) { ans=ans/i*(i-1); while(n%i==0)n/=i; } if(n>1)ans=ans/n*(n-1); return ans; }
求1-n的欧拉函数
O(nloglogn)
int phi[100]; void euler_table(int n) { for(int i = 2; i <= n; i++)phi[i]=0; phi[1]=1; for(int i = 2; i <= n;i++)if(!phi[i]) for(int j= i; j <= n; j+=i) { if(!phi[j])phi[j]=j; phi[j]=phi[j]/i*(i-1); } }
快速幂
int power(int a,int b) { if(!b)return 1; if(b==1)return a; int p=power(a,b/2); p=(LL)p*p%mod; if(b%2)return p*a%mod; return p; }
差不多了,还有些以后再说吧。。。
相关文章推荐
- 【模板】【数论】gcd和exgcd
- 基础数论算法(2) GCD LCM EXGCD 学习笔记
- DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板
- Code Forces 582 A. GCD Table(数论)
- (hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)
- {模板}Gcd及ExGcd
- Codeforces #323 div2 C. GCD Table 数论 构造
- 模板 2018-01-27 数论 最大公因数 最小公倍数 拓展欧几里得 GCD LCM 逆元
- exgcd&gcd模板
- (hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)
- 【数论】gcd|扩展gcd|素数筛法|快速幂|欧拉函数(各种模板)
- UVA 10820 Send a Table euler_phi功能
- HDU 1787 GCD Again/HDU 2824 The Euler function(欧拉函数模板)
- <模板>(Miller-Rabin和Pollard_rho算法)poj 2429 GCD & LCM Inverse (数论)
- 新视野OJ 2190 [SDOI2008]仪仗队 (数论-gcd)
- LibreOJ β Round #2 E. 数论只会 GCD
- 数论模板
- 【Luogu3807】【模板】卢卡斯定理(数论)
- extgcd 扩展欧几里得算法模板
- GCD Table 中国剩余定理、解线性同余方程组