最近几次比赛每次都被一些题目坑到超时,所以把每次看到比较优秀的模板给抄下来,留着备用。
前面:
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<iostream>
#include <algorithm>
#include<cstdio>
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 ; i<n;i++)
scand(a[i]);
nth_element(a,a+n-k,a+n);
cout<<a[n-k]<<endl;
}
//nth_element(first,nth,end,compare)
//比如a[10]中找出第2大的数,则为:nth_element(a,a+2-1,a+10) 减一是从第0大开始
后面慢慢补。。。