标签:lin blank not ++ code oid 快速 div span
仓鼠大神博客:http://www.cnblogs.com/linyujun/p/5194184.html
http://www.cnblogs.com/linyujun/p/5194170.html
①gcd
一行版:
unsigned int gcd(unsigned int a,unsigned int b) { return b>0?gcd(b,a%b):a; }
位运算版:
ll gcd(ll a,ll b) { while(b^=a^=b^=a%=b); return a; }
②快速幂和快速乘
ll pow(ll n,ll k) { ll ans=1; while(k) { if(k%2) ans*=n; n*=n; k/=2; } return ans; } ll mul(ll n,ll k) { int ans=0; while(k) { if(k%2) ans+=n; n+=n;//n*=2; k/=2; } return ans; }
③扩展欧几里得(扩展gcd)
int e_gcd(int a,int b,int &x,int &y) { if(!b) { x=1; y=0; return a; } int ans=e_gcd(b,a%b,x,y); int temp=x; x=y; y=temp-a/b*y; return ans; } int e_gcd(int a,int b,int &x,int &y){ if (!b) { x=1,y=0; return a; } int ans=e_gcd(b,a%b,y,x);//注意x,y位置和上面不同 y-=a/b*x; return ans; }
④乘法逆元
扩展欧几里得版:
ll e_gcd(ll a,ll b,ll &x,ll &y) { if(!b) { x=1; y=0; return a; } ll ans=e_gcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return ans; } ll inv(ll a,ll n) { ll x,y,d=e_gcd(a,n,x,y); if(d==1)return (x%n+n)%n; else return -1; }
费马小定理版:
LL pow_mod(LL a, LL b, LL p){//a的b次方求余p LL ret = 1; while(b){ if(b & 1) ret = (ret * a) % p; a = (a * a) % p; b >>= 1; } return ret; } LL Fermat(LL a, LL p){//费马求a关于b的逆元 return pow_mod(a, p-2, p); }
⑤素数筛
void prime(int n) { for(int i=2;i<=n;i++) { if(!not_prime[i]) { for(int j=i+i;j<=n;j+=i) not_prime[j]=true; } } }
⑥欧拉筛
phi(n)表示小于等于n与n互质数的个数
void Euler(){ 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); } } } }
未完待续。。。
标签:lin blank not ++ code oid 快速 div span
原文地址:http://www.cnblogs.com/widsom/p/7173095.html