【数论板子】_我也就会这些

来源:互联网 发布:500价位耳机知乎 编辑:程序博客网 时间:2024/06/05 19:41

1、最大公约和最小公倍

int gcd(int a,int b) return b==0?a:gcd(b,a%b);int lcm(int a,int b) return a*b/gcd(a,b);

2、组合数
注意初始化和边界

void find_C(){    for (ll i=0; i<=2000; i++) c[i][0]=c[i][i]=1;    for (int i=1; i<=2000; i++)        for (int j=1; j<=2000; j++)            c[i][j]=c[i-1][j]+c[i-1][j-1];

3、Catalan数

Catalan[n]=c[2*n][n]-c[2*n][n-1];

递推

ca[0]=1; ca[1]=1;ca[i]=ca[i-1]* (4*i-2)/(i+1);

4、筛素数

void oula(){    for (int i=2; i<=n; i++)    {        if (!he[i]) prime[++nump]=i;        for (int j=1; j<=nump&&i*prime[j]<=n; j++)        {            he[i*prime[j]]=1;            if (i%prime[j]==0) break;        }    }}

5、分解质因数

#include<cstdio>using namespace std;int n;int main(){    scanf("%d",&n);    for (int i=2; i<=n; i++)    {        while (n!=i)        {            if (n%i==0) {printf("%d*",i); n/=i;}            else break;        }    }    printf("%d",n);    return 0; }

6、扩欧

#include<cstdio>using namespace std;int a,b,x,y,gcd;int exgcd(int a,int b,int &x,int &y){    if (b==0) {x=1; y=0; return a;}    int r=exgcd(b,a%b,x,y),t=x;    x=y;    y=t-a/b*y;    return r;}int main(){    scanf("%d%d",&a,&b);    gcd=exgcd(a,b,x,y);    printf("%d",(x+b)%b);    return 0;}

7、快速幂(模)

#include<cstdio>#include<algorithm>using namespace std;#define ll long longll a,n,p;ll ksm(ll a,ll n){    ll s=1;    while (n)    {        if (n&1==1) s*=a;        a*=a;        n>>=1;    }    return s;}ll ksm_mod(ll a,ll n,ll p){    ll s=1;    while (n)    {        if (n&1) s=(s*a)%p;        a=(a*a)%p;        n=n>>1;    }    return s;}int main(){    scanf("%lld%lld%lld",&a,&n,&p);    printf("%d^%d=%d\n",a,n,ksm(a,n));    printf("%lld^%lld mod %lld=%lld",a,n,p,ksm_mod2(a,n,p));    return 0;}/*2547862 87432 441692547862^87432 mod 44169=31108*/

一篇比较好的blog:http://blog.csdn.net/u012709325/article/details/52686735