究极卡常神技

2021 01 26 机房发生了第一次卡常世界大战

故写文总结

快速取模

return x-x/p*p

fread+write

char buf[1<<22],Out[1<<22],*p1=buf,*p2=buf;
ll p3=-1,FF=0;
#define getchar() (p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline void flush(){fwrite(Out,1,p3+1,stdout),p3=-1;}
inline void Check(){if (p3>(1<<21)) flush();}
inline void Putchar(char a){Out[++p3]=a;Check();}
inline ll read(){
	register ll sum=0,FF=0;
	char c=getchar();
	while(!isdigit(c))FF|=(c=='-'),c=getchar();
	while(isdigit(c)) sum=(sum<<1)+(sum<<3)+(c^48),c=getchar();
	return FF?-sum:sum;
}
inline void writ(register ll x){
	if(x<0){
		x=-x;
		putchar('-');
	}
	if(x>9) writ(x/10);
	Putchar(x%10+'0');
}
···
···
···代码
输出·······
flush();

要点,快速取模,快速getchar,把buf开大有时也能降常

inline

函数(非递归)不要忘记加inline

register

在定义变量前写上register,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量(比如循环变量)
有时候不要定义全局变量,在主函数内用register,并且在函数中可以尽量用register

static

可以降常,具体性质,注意事项不明,慎用

++i

在for中,不要i++,要++i

^

!=可以用^替代,<=、<等有时也可以

-'0'

使用^48代替

初始化优化

int n=1//一般做法
int n(1)//优化做法

绝对值优化

int abs(int n){
return (n ^ (n >> 31)) - (n >> 31);
/* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1
若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算,
结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */
}

max,min优化

int max(int a,int b){
    return b & ((a-b) >> 31) | a & (~(a-b) >> 31);
    /*如果a>=b,(a-b)>>31为0,否则为-1*/
}
int min(int a,int b){
    return a & ((a-b) >> 31) | b & (~(a-b) >> 31);
    /*如果a>=b,(a-b)>>31为0,否则为-1*/
}

判断是否2的n次幂

boolean isFactorialofTwo(int n){
    return n > 0 ? (n & (n - 1)) == 0 : false;
    /*如果是2的幂,n一定是100... n-1就是1111....
       所以做与运算结果为0*/
}
posted @ 2021-01-26 21:46  蒟蒻丁  阅读(112)  评论(0编辑  收藏  举报