函数库01

 

//素数判断

 

bool SS(int a){
    if(a<=1)return false;
    for(int i=2;i*i<=a;i++)
        if(a%i==0)return false;
    return true;
}

 

  

//素数判断(筛选法)

int p[10000010];
void SAI(int u){
    for(int i=2;i*i<=u;i++)if(!p[i])
        for(int j=i*i;j<=u;j+=i)p[j]=1;
}

  

 //因子和

int YZH(int a){
    int x=0,i;
    for(i=2;i*i<a;i++)if(a%i==0)x=x+i+a/i;
    if(i*i==a)x=x+i;
    return x;
}

  

//因子数 

int YZS(int a){
    if(a==1)return 1;
    int x=2,i;
    for(i=2;i*i<a;i++)if(a%i==0)x=x+2;
    if(i*i==a)x++;
    return x;
}

  

 

 

//最大公约数、最小公倍数(递归版)

int GCD(int a,int b){return b?GCD(b,a%b):a;}
int LCM(int a,int b){return a/GCD(a,b)*b;}

  

 

//最大公约数(非递归版)

int GCD(int a,int b){
    while(b){
        int r=a%b;
        a=b;b=r;
    }
    return a;
}

  

 

//回文判断(数值版)

int FZ(int a){
    int b=0;
    while(a>0){
        b=b*10+a%10;
        a=a/10;
    }
    return b;
}
bool HW(int a){return a==FZ(a);}

  

  

 

 

//回文判断(字符串版)

bool PLD(string s){
    int le=s.size();
    for(int i=0;i<le/2;i++)
        if(s[i]!=s[le-1-i])return false;
    return true;
}

 

 

//高精度乘法

void multi(int b){
    for(int i=1;i<=len;i++)a[i]*=b;  //按位相乘
    for(int i=1;i<=len-1;i++)a[i+1]+=a[i]/10,a[i]%=10;  //进位
    while(a[len]>=10)a[len+1]=a[len]/10,a[len]%=10,len++;  //增位
}
void print(){
    for(int i=len;i>0;i--)printf("%d",a[i]);
    puts("");
}

 

//Catalan数高精版(n<=5000)

#include <stdio.h>
int a[5100][800],len;
void catalan(int n){ //求卡特兰数
    int i, j,  carry, temp;
    a[1][0] = 1;
    len = 1;
    for(i = 2; i <= n; i++){
        for(j = 0; j < len; j++) //乘法
        a[i][j] = a[i-1][j]*(4*(i-1)+2);
        carry = 0;
        for(j = 0; j < len; j++){ //处理相乘结果
            temp = a[i][j] + carry;
            a[i][j] = temp % 10000;
            carry = temp / 10000;
        }
        while(carry){ //进位处理
            a[i][len++] = carry % 10000;
            carry /= 10000;
        }
        carry = 0;
        for(j = len-1; j >= 0; j--){ //除法
            temp = carry*10000 + a[i][j];
            a[i][j] = temp/(i+1);
            carry = temp%(i+1);
        }
        while(!a[i][len-1])len--; //高位零处理
    }
}
int main(){
    int n,i;
    scanf("%d",&n);
    catalan(n);
    //printf("%d\n",len);
    printf("%d",a[n][len-1]);
    for(i=len-2;i>=0;i--)printf("%04d",a[n][i]);
    puts("");
    return 0;
}

  

  

 //输入优化

 

inline int read(){
    int x=0;char ch;bool f=true;
    while(!isdigit(ch=getchar()))if(ch=='-')f=false;
    for(x=ch^48;isdigit(ch=getchar());)x=(x<<3)+(x<<1)+(ch^48);
    return f?x:-x;
}

 

  

 

 

inline int read(){
    int x=0,w=0; char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return w?-x:x;
}

  

 

posted @ 2016-04-18 18:10  codeisking  阅读(1829)  评论(0)    收藏  举报