究极卡常神技
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*/
}