gcd && lcm
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int lcm(int p,int q)
{
int a=gcd(p,q);
return p*q/a;
}
exgcd
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
int exgcd(int a, int b, int &x, int &y)
{
if(!b)
{
x = 1; y = 0;
return a;
}
int ans = exgcd(b,a%b,x,y);
int t = x;
x = y;
y = t-a/b*y;
return ans;
}
int main()
{
int a, b, x, y;
cin >> a >> b;
cout << exgcd(max(a,b),min(a,b),x,y) << " " << x << " " < y << '\n';
return 0;
}
快速幂:
long long ksm(long long a,long long b,long long c)
{
long long ans=0;
while (b)
{
if (b&1)
ans=((ans%c)*(a%c))%c;
a = ((a%c)*(a%c))%c;
b >>= 1;
}
return ans;
}
求逆元(exgcd / 费马小定理):
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
ll t=y;
y=x-(a/b)*y;
x=t;
return r;
}
ll inv(ll a)
{
ll x,y;
ll r=exgcd(a,mod,x,y);
if(r==1) return (x%mod+mod)%mod;
return -1;
}
//
long long gcd(long long a,long long b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
long long ksm(long long a,long long b,long long c)
{
long long ans=0;
while (b)
{
if (b&1)
ans=((ans%c)*(a%c))%c;
a = ((a%c)*(a%c))%c;
b >>= 1;
}
return ans;
}
long long ny(long long a,long long p)
{
if(gcd(a,p) == 1)
return ksm(a,p-2);
}
线性筛法:
bool not_prime[101000];
int prime[101000],cnt,n;
int main()
{
scanf("%d",&n);
not_prime[1]=1;
for(int i=2;i<=n;i++)
{
if(!not_prime[i])
prime[++cnt]=i;
for(int j=1;j<=cnt;j++)
{
if(prime[j]*i>n) break;
not_prime[prime[j]*i]=1;
if(!i%prime[j]) break;
}
}
for(int i=1;i<=cnt;i++)
cout<<prime[i]<<" ";
return 0;
}
埃氏筛法:
int main()
{
int n;
cin >> n;
for(int i=2;i<=sqrt(n);i++)
{
if(!vis[i])
{
for(int j=i*i;j<=sqrt(n);j+=i)
vis[j]=1;
}
}
for(int i = 2; i <= n; ++ i)
if(!vis[i]) printf("%d ", i);
return 0;
}
组合数:
const int M = 10007;
const int MAXN = 1000;
int C[MAXN+1][MAXN+1];
void Initial()
{
int i,j;
for(i=0; i<=MAXN; ++i)
{
C[0][i] = 0;
C[i][0] = 1;
}
for(i=1; i<=MAXN; ++i)
{
for(j=1; j<=MAXN; ++j)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % M;
}
}
int zhs(int n, int m)
{
return C[n][m];
}