编程中常用到的一些代码[转]

本文都是些很基本的东西,但每次用都要找,索性整理在一起,方便以后查(Ctrl+C)阅(Ctrl+V)

1、手动扩栈(C++)

#pragma comment(linker, "/STACK:102400000,102400000")
 
2、memset
memset(a,0,sizeof(a));//a[0]=0
memset(a,255,sizeof(a));//a[0]=-1
memset(a,0x3f,sizeof(a));//a[0]=0x3f3f3f3f=1061109567≈INT_MAX/2
memset(a,0xc0,sizeof(a));//a[0]=0xc0c0c0c0=-1061109568≈-INT_MAX/2
 
3、优先队列priority_queue
priority_queue<int> q1;//默认大的先出队
priority_queue<int,vector<int>,greater<int> > q2;//小的先出队


//自定义比较函数
struct cmp{
	bool operator ()(int x,int y){
		return x>y;//x小的优先级高,结构体同
	}
};
priority_queue<int,vector<int>,cmp > q3;//定义


//重载运算符
struct node{
	int x,y;
	friend bool operator < (node a,node b){//友元函数,如果用成员函数记得加const
		return a.x>b.x;//x小的优先级高
	}
};
priority_queue<node> q4;//定义
//最好重载'<'
 
4、输入输出挂

//输入挂
inline int scan()
{
	int res = 0, ch, flag = 0;
	if((ch = getchar()) == '-')
	flag = 1;
	else if(ch >= '0' && ch <= '9')
		res = ch - '0';
	while((ch = getchar()) >= '0' && ch <= '9' )
		res = res * 10 + ch - '0';
	return flag ? -res : res;
}


//输出挂
inline void out(int x)
{
	if(x>9) out(x/10);
	putchar(x%10+'0');
}

fread读入挂

const int BUFSIZE=120<<20; //根据题目数据而定
char Buf[BUFSIZE+1],*buf=Buf;
template<class T>
inline void scan(T&a){
	for (a=0;*buf<'0'||*buf>'9';buf++);
	while (*buf>='0'&&*buf<='9'){a=a*10+(*buf-'0');buf++; }
}

fread(Buf,1,BUFSIZE,stdin); //加到main函数第一行

5、lower_bound()&upper_bound()
lower_bound(__first, __last, __val)//返回大于等于某值的第一个元素的迭代器

upper_bound(__first, __last, __val)//返回大于某值的第一个元素的迭代器

6、内联汇编快速乘法(G++)

inline long long mulmod(long long x, long long y, long long mod)
{
	long long ret = 0;
	__asm__("movq %1,%%rax\n imulq %2\n idivq %3\n":"=d"(ret):"m"(x),"m"(y),"m"(mod):"%rax");
	return ret;
}

//非汇编版本
long long mulmod(long long x, long long y, long long mod)
{
	long long ret = 0,tmp=x;
	while(y){
		if(y&1) ret=(ret+tmp)%mod;
		y>>=1;
		tmp=(tmp+tmp)%mod;
	}
	return ret;
}
7、快速开方
float InvSqrt(float x)
{
	int i;
	float xhalf=0.5*x,y=x;
	i=*(int *) &y;     
	i=0x5f375a86 - ( i >> 1 ); 
	y=*(float *) &i;
	y=y*(1.5-(xhalf*y*y)); 
	y=y*(1.5-(xhalf*y*y));  	
	y=y*(1.5-(xhalf*y*y)); 
	return x*y;
}
 
8、拓展欧几里得算法
int extend_gcd(int a,int b,int &x,int &y)
{  
    int d;  
    if(b==0){  
        x=1;y=0;  
        return a;  
    }  
    d=extend_gcd(b,a%b,y,x);  
    y-=a/b*x;
    return d;  
}
 
9、中国剩余定理(CRT)
long long crt(long long a[],long long m[],long long n)//a[]为余数
{
    long long M=1;
    for(int i=1;i<=n;i++) M*=m[i];
    long long ret=0;
    for(int i=1;i<=n;i++){
    	long long x,y;
    	long long tm=M/m[i];
    	extend_gcd(tm,m[i],x,y);
    	ret=(ret+mulmod(mulmod(tm,x,M),a[i],M))%M;
	}
	return (ret+M)%M;
}
 
待补充......
原文:http://www.sdwalker.com/archives/305
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值