小技巧集合

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,左移和右移都需要~ 

原文地址:https://www.cnblogs.com/sky-zxz/p/9727413.html