小技巧集合
1.无论一个字母是大写还是小写,(?&31)就是它在字母表中的位置。这种简便的方法可以用于 有关篡位 的题,例如:Vigenère 密码。
2.十进制转R进制 ,R 为负数,还是按照常规的操作,要注意一点:
当余数<0,则商+1,余数+|R|
代码:
k=x%r;余数 x=x/r;商 if(k<0){ x++; k-=r; }
3.原来一直以为long long int 比 int 慢不了多少,当我真正因为long long int 被卡时间的时候才发现,两者时间相差真的很多...
4.long double 比 long long int 要大...
5.n个点的不同形态的无根树个数是n^(n-2),N个点的无根树的生成方式有(n-1)!种。
6.观察一下
1^1=0 0^0=0 1^0=1 1^1=0
结论:相同为0,不同为1.
性质:
a^b=b^a (a^b)^c=a^(b^c) a^b^b=a a^0=a
7.求从(1-->n)或(0-->n)的异或和:
n%4==0 ans=n; n%4==2 ans=n+1; n%4==1 ans=1; n%4==3 ans=0;
8.求下一个排列:
在<algorithm>库中
next_permutation(a+1,a+n+1);
求上一个排列:
prev_permutation
9.记录所有在a--->b最短路路径上的点。
for(R int j=1;j<=n;j++) if(f[a][b]==f[a][j]+f[j][b]) ans[++cnt]=j;
可以保证若满足这个等式,J必定在A--->B的最短路上。
10.异或的一些性质:
(1)如果A>=B,那么A-B<=A^B.
11.如果要判断一个二进制数是否有两个数相邻,只需要左移或者右移即可。
如果要判断两个二进制数是否有相邻位同为1,左移和右移都需要~