ACM模版——数学相关

//===========================================\\

|    打印素数表                              |

\\===========================================//

int prime[100001],pcount=1;

bool s[1300000];  //可直接判断是否素数

void pri()

{

      int i,j;

      memset(s,true,sizeof(s));

      prime[1]=2;

      for ( i=3; i<=1299709; i+=2 )

     {

          if ( s[i] )

          {

                 prime[++pcount]=i;

                 for ( j=2; i*j<=1299709; j++) s[i*j]=false;

           }

     }

}

n

Prime[n]

n

Prime[n]

100

541

700

5279

150

863

1000

7919

200

1223

5000

48611

250

1583

10000

104729

300

1987

50000

611953

500

3571

100000

1299709

//===========================================\\

|    欧拉函数                                |

\\===========================================//

int Euler[100001];   //打印欧拉函数表

void Eu()

{

    memset(Euler,0,sizeof(Euler));

    Euler[1]=1;

    for (int i=1; i<=100000; i++)

if ( !Euler[i] )

        for (int j=i; j<=100000; j+=i)

        {

            if ( !Euler[j] ) Euler[j]=j;

            Euler[j]=Euler[j]/i*(i-1);

        }

}

   - - - - - - - - - - - - - - - - - - - - - - -

int Euler(int x) //若无打印素数表,i替换prime[i]

{

int i,temp=x;

if ( x==1 ) return 1;

else

{

for (i=1; prime[i]*prime[i]<=x; i++)

if ( x%prime[i]==0)

{

temp=temp/prime[i]*(prime[i]-1);

while ( x%prime[i]==0 ) x/=prime[i];

}

if ( x>1 ) temp=temp/x*(x-1);

return temp;  

}

}

//===========================================\\

|    GCD求最大公约数                        |

\\===========================================//

int gcd (int a,int b)

{

    for (int t; t=a%b; a=b, b=t);

    return b;

}

//===========================================\\

|    扩展GCD,求 ( x , y )使得gcd ( a , b )=ax+by  |

\\===========================================//

// g=gcd(a,b),其余解(x0+kb/g, y0-ka/g),k为整数

// x0不一定为正数,输入的a、b均可为负数

void extgcd(int a,int b)

{

    if ( !b ) { g=a; x=1; y=0; }

    else { extgcd(b,a%b); int t=x; x=y; y=t-x*(a/b); }

}

/============================================\\

|   中国剩余定理                             |

\\===========================================//

// ans=b( mod w),gcd(wi,wj)=1

int china(int b[],int w[],int l,int r)

{

    int i,ans=0,s=1,m;

    for (i=l; i<=r; i++) s*=w[i];

    for (i=l; i<=r; i++)

    {

        m=s/w[i];

        extgcd(w[i],m);

        ans=(ans+y*m*b[i])%s;

    }

    if ( ans>0 ) return ans;

    else return ans+s;

}

//===========================================\\

|    x^n mod k                          |

\\===========================================//

int powmod(int x,int n,int k)

{

    if ( n<=1 ) return x%k;

    int a=powmod(x,n/2,k);

    long long ans=a*a%k;

    if ( n%2 ) ans=ans*x%k;

    return int(ans);

}

//===========================================\\

|    阶乘最后非0                          |

\\===========================================//

int lastdigit(char* buf)

{

    Int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};

    int len=strlen(buf),a[1000],i,c,ans=1;

    if ( len==1 ) return mod[buf[0]-'0'];

    for (i=0; i<len; i++) a[i]=buf[len-i-1]-'0';

    for ( ; len; len-=!a[len-1])

    {

        ans=ans*mod[a[1]%2*10+a[0]]%5;

        for (c=0,i=len-1; i>=0; i--)

        {

            c=c*10+a[i];

            a[i]=c/5;

            c%=5;

        }

    }

    return ans+ans%2*5;

}

//===========================================\\

|    求和公式    k = 123….n           |

\\===========================================//

Sum(k)= n(n+1)/2

Sum(2k-1)= n^2

Sum(k^2)= n(n+1)(2n+1)/6

Sum((2k-1)^2)= n(4n^2-1)/3

Sum(k^3)= (n(n+1)/2)^2

Sum((2k-1)^3)= n^2(2n^2-1)

Sum(k^4)= n(n+1)(2n+1)(3n^2+3n-1)/30

Sum(k^5)= n^2(n+1)^2(2n^2+2n-1)/12

Sum(k(k+1))= n(n+1)(n+2)/3

Sum(k(k+1)(k+1))= n(n+1)(n+2)(n+3)/4

Sum(k(k+1)(k+2)(k+3))= n(n+1)(n+2)(n+3)(n+4)/5

//===========================================\\

|    组合公式                                |

\\===========================================//

C(n, r) = C(n, n-r)

C(n+1, r+1) = C(n, r+1)+C(n, r)  //杨辉三角

C(n, r) C(r, m)=C(n, m)C(n-m, r-m)=C(n, k-m)C(n-k+m, m)

K*C(n, k)=(n-k+1)*C(n, k-1)

k*C(n, k)=n*C(n-1, k-1)

C(n, 0)+C(n, 1)+C(n, 2)+…+C(n, n)=2^n

C(n, 0)-C(n, 1)+C(n, 2)+…+(-1)^n*C(n, n)=0

//===========================================\\

|    C(n, r)                                 |

\\===========================================//

int C(int n,int r)

{

    int i,ans=1;

    if ( n-r<r ) r=n-r;

    for (i=1; i<=r; i++) ans=ans*(n-i+1)/i;

    return ans;

}

//===========================================\\

|    Catalan                              |

\\===========================================//

h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…+h(n-1)h(0) (n>=2)

h(n)=h(n-1)*(4n-2)/(n+1)=C(2n,n)/(n+1)

前几项:h(0)=1、h(1)=1、2、5、14、42、132、429、1430、4862、16796、58786、208012、742990

1、  长度2n的dyck word的个数。Dyck word:由n个X、Y组成的字串,且所有的前缀字串皆满足X的个数大于等于Y的个数。(若将XY换成(),计算合法运算式的个数)

XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY

2、  有n个节点组成不同构二叉树的方案数。

3、  通过连结顶点而将n + 2边的凸多边形分成三角形的方法个数。

4、  对{1, ..., n}依序进出栈的置换个数。

n个矩形填充一个高度为n的阶梯状图形的方法个数。(非轴对称的算2个)

posted @ 2012-09-22 13:46  枫落丹寒  阅读(148)  评论(0)    收藏  举报