ACM自用常用模板(c++版)

最近几次比赛每次都被一些题目坑到超时,所以把每次看到比较优秀的模板给抄下来,留着备用。

前面:

typedef long long LL;
//#define MOD xxx
const int MOD=xxx;

1.排列组合公式

//C(m,n)

LL C(int m,int n) {
    int k=1;//相当于C(m,n)
    LL ans=1;
    while(k<=n) {
        ans=((m-k+1)*ans)/k;
        k++;
    }
    return ans;
}

2.最大公因数(gcd)

int gcd(int a,int b) {
    if(!a)
        return b;
    int c;
    while(b) {//非递归版
        c=b;
        b=a%b;
        a=c;
    }
    return a;
}

3.快速幂公式

LL qpow(LL a, LL b) {//a的n次方(可取模)
    LL ans = 1;
    while (b) {
        if (b & 1) {
            ans *= a;
            ans %= MOD;
        }
        b >>= 1;
        a *= a;
        a %= MOD;
    }
    return ans;
}

4.大数运算

详细可见这位写的博客:http://www.cnblogs.com/teble/p/7224597.html

5.超大数据读取(比如acdream 1099题目)+部分排序(STL)

#include
#include 
#include
using namespace std;
const int N = 10e6;
 void scand(int &ans)
{
    char c;
    ans = 0;
    while((c=getchar())<'0' || c>'9');//去掉空格类的东西
    while(c>='0'&&c<='9')
        ans=(ans<<3)+(ans<<1)+(c-'0'),c=getchar();
}
int a[N];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i = 0 ; icout<//nth_element(first,nth,end,compare)
//比如a[10]中找出第2大的数,则为:nth_element(a,a+2-1,a+10) 减一是从第0大开始

后面慢慢补。。。

你可能感兴趣的:(模板)