【模板】OI基本模版

這裏發一些基本的模版,就這樣~函數

1. 0-1揹包ui

int bag_01() { //01揹包 
    for(int i = 1; i <= n; i++)
        for(int j = c; j >= w[i]; j--)
            f[j] = max(f[j], f[j-w[i]]+v[i]);
    return f[c];
}
//對於徹底揹包(物品不限):將第二個循環的順序反向便可。 

2. 二分查找spa

//這是找最大
int Binary_Search(int Left, int Right) {
    while(Left <= Right) {
        int Mid = (Left + Right) / 2;
        if(check(Mid))
            Left = Mid + 1;
        else
            Right = Mid - 1;
    }
    return Left - 1;
}
//這是找最小
int Binary_Search(int Left, int Right) {
    while(Left <= Right) {
        int Mid = (Left + Right) / 2;
        if(check(Mid))
            Right = Mid - 1;
        else
            Left = Mid + 1;
    }
    return Right + 1;
}

3. 計算n的因子個數code

int calc(int n){ //calc(n) : 計算n的因子個數 
    int ans=1, t;
    for (int i=2; i*i<=n; i++){
        for (t=0; n%i==0; n/=i)
            t++;
        ans*=t+1;
    }
    if (n>1) 
        ans*=2;
    return ans;
}

4. 最大公約數blog

int gcd(int a, int b) {
    return b ? gcd(b, a%b) : a; 
}
//gcd函數返回a和b的最大公約數(a>b) 最小公倍數=a*b/gcd(a,b) 

5. 最長公共子序列get

int LCS() {
    for(int i = 1; i <= xl; i++) 
        for(int j = 1; j <= yl; j++)
            if(x[i] == y[j]) 
                f[i%2][j] = f[(i-1)%2][j-1]+1;
            else
                f[i%2][j]=max(f[(i-1)%2][j],f[i%2][j-1]);
    return f[xl%2][yl];
}

6. 篩法求素數class

void prime(int n) { //篩法求素數表 
    for(int i = 2; i <= sqrt(n); i++)
        if(!p[i])
            for(int j = i+i; j <= n; j += i) p[j] = 1;
}
//p[i]=0:該數是素數;p[i]=1:該數不是素數 

7. 快速冪循環

int quickpow(int a, int b, int m){ //快速冪 求a^b%m的值     
    int t=1;
    while (b){
        if (b&1) t=t*a%m;
        b>>=1; a=a*a%m;  
    }
    return t;
}

8. 快速讀入整數gc

inline void read(int& x){
    char c=getchar(); int f=1,num=0;
    for(;c<'0'||c>'9';c=getchar()) if(c=='-')f=-1;
    for(;c>='0'&&c<='9';c=getchar()) num=num*10+c-'0';
    x=num*f;
}

 

這些都是最基本的模版哦!若是有什麼其餘的有用的模版歡迎在評論區中提出哦!im

相關文章
相關標籤/搜索