素数--筛选法打表,快速幂,欧拉函数,gcd
2017-10-01 12:22
429 查看
素数筛选法打表
快速幂取余
1
2
欧拉函数
这两天在网上刚发现了一个欧拉筛选法,时间复杂度达到线性,很强!
没看懂,去大牛的博客里把模板copy过来用下~
辗转相除法(gcd)
扩展欧几里得
乘法逆元
逆元打表
阶乘逆元打表
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int M=1e6; int check[M+50]; int prime[M+50]; int len=0; void init() { int i,j; for(i=2; i*i<=M; i++) { if(!check[i]) { for(j=i*i; j<M; j+=i) check[j]=1;//1代表非素数,0代表素数 } } check[1]=1; for(i=1; i<=M; i++) { if(!check[i]) { prime[++len]=i; } } } int main() { init(); int n; cin>>n;//输出前n个素数 for(int i=1; i<=n; i++) cout<<prime[i]<<endl; }
快速幂取余
1
#include<iostream> using namespace std; int main() { int i,j,k; int a,b,c,ans=1; cin>>a>>b>>c; a=a%c; while(b) { if(b%2==1) ans=a*ans%c; b/=2; a=a*a%c; } cout<<ans%c<<endl; }
2
#include<iostream> using namespace std; int main() { int i,j,k; int a,b,c,ans=1; cin>>a>>b>>c; a=a%c; while(b) { if(b&1) ans=a*ans%c; a=a*a%c; b>>=1; } cout<<ans%c<<endl; }
欧拉函数
#include<iostream> using namespace std; int euler(int n) { int ans=n,a=n; for(int i=2;i*i<=a;i++) { if(a%i==0) { ans=ans/i*(i-1); while(a%i==0) a/=i; } } if(a>1) ans=ans/a*(a-1); return ans; } int main() { int T; cin>>T; while(T--) { int x; cin>>x; cout<<euler(x)<<endl; } }
这两天在网上刚发现了一个欧拉筛选法,时间复杂度达到线性,很强!
没看懂,去大牛的博客里把模板copy过来用下~
//check数组里为0的代表素数,prime数组为素数表 #include<iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN=1e5; const int MAXL=1e6; int prime[MAXN+50]; bool check[MAXL+50]; int main() { int n, len; memset(check, 0, sizeof(check)); len = 0; for (int i = 2; i <= MAXL; i++) { if (!check[i]) prime[len++] = i; for (int j = 0; j < len; j++) { if (i*prime[j] > MAXL) break; // 过大的时候跳出 check[i*prime[j]] = 1; if ((i%prime[j]) == 0) // 如果i是一个合数,而且i % prime[j] == 0 break; } } check[1]=1; while (~scanf("%d", &n)) { for (int i = 1; i <=n; i++) { if(!check[i]) cout<<i<<endl; } } }
辗转相除法(gcd)
#include<iostream> using namespace std; long long int gcd(int m,int n) { if(n==0) return m; return gcd(n,m%n); } int main() { long long int m,n; while(cin>>m>>n) { cout<<gcd(m,n)<<endl; } }
扩展欧几里得
LL exgcd(LL a,LL b,LL &x,LL &y) { if(!b) { x=1; y=0; return a; } LL ans=exgcd(b,a%b,x,y); LL temp=x; x=y; y=temp-a/b*y; return ans; }
乘法逆元
int extgcd(int a, int b, int& x, int& y) { int d = a; if(b != 0){ d = extgcd(b, a % b, y, x); y -= (a / b) * x; }else { x = 1; y = 0; } return d; } int mod_inverse(int a, int m) { int x, y; extgcd(a, m, x, y); return (m + x % m) % m; }
逆元打表
const int mod = 1000000009; const int maxn = 10005; int inv[maxn]; inv[1] = 1; for(int i = 2; i < 10000; i++) inv[i] = inv[mod % i] * (mod - mod / i) % mod;
阶乘逆元打表
inv[maxn]=mod_pow(fac[maxn],mod-2); for(ll i=maxn-1;i>=0;i--) inv[i]=(inv[i+1]*(i+1))%mod;
相关文章推荐
- GCD&LCM&素数打表&快速幂
- 暑假培训第一天GCD LCM 素数打表 快速幂
- UVa 11426 GCD - Extreme (II) / 素数筛选 + 欧拉函数
- hdu 1695 GCD (素数筛选 + 欧拉函数 + 容斥原理)
- HDU 4497 GCD and LCM (素数筛选+算术基本定理)
- LightOJ Bi-shoe and Phi-shoe 1370【欧拉函数+素数打表】
- poj 2480 Longge's problem 欧拉函数+素数打表
- 素数筛选法,快速获取素数序列
- 质数快速筛法;欧拉函数线性打表;因子个数,因子和打表
- GCD 扩展GCD 快速GCD 模线性方程 模线性方程组 单独求欧拉函数 递推求欧拉函数
- 埃氏筛法(快速筛选n以内素数的个数)
- kmp.gcd.快速幂.判断素数模板
- poj3696 快速幂的优化+欧拉函数+gcd的优化+互质
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- ACM刷题之HDU————相遇周期(真·打表(素数筛选))
- HDU1695素数打表欧拉函数容斥原理(再看)
- 杭电4548 好长的筛选素数,打表,细节特别要注意l代表后面的大的那个数
- 快速幂取模&&素数筛选&&最大公约数
- 【Ligth-oj】-1370 - Bi-shoe and Phi-shoe(欧拉函数+素数打表)
- 快速幂 生成素数表 生成Euler欧拉函数值表