首页 > 代码库 > 【模板】OI基本模版

【模板】OI基本模版

这里发一些基本的模版,就这样~

1. 0-1背包

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. 二分查找

//这是找最大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的因子个数

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. 最大公约数

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

5. 最长公共子序列

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. 筛法求素数

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. 快速读入整数

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;}

 

这些都是最基本的模版哦!如果有什么其他的有用的模版欢迎在评论区中提出哦!

【模板】OI基本模版