1.int的 数据范围大概在2e9左右;
2.int有32位二进制且第一位是从零开始;
3.取第一位可以用b>>0 &1 ;也可以直接b &1 ;
4.所使用的强制类型转换是与直接相应定义作用相同的但别忘了输入也会爆掉;
5.为什么含有除法的取mod要用到逆元?:
因为确保每一步都不会过大我们会将每一步乘法都会取mod但是列如a[i-1]=100%31=7;a[i]=a[i-1]/2%31,正常来说100除2=50然后答案应该是19;但是经过前一步取mod导致带进去的不是一百而是7所以答案变成了3;所以说一次取mod是正确的但是多次取mod将会产生错误,要用到逆元!2对于31的逆元是16,所以将除法换成;答案716%31=19;答案正确!会发现只有当a[i-1]就是7时反而产生了错误,没关系因为我们这里逆元是同余与,所以当进行多次运算后答案依然是正确的!而且这里并不是相等而是取mod后相等所以算数很少时不能用(列如只有某一位运算时且被除数小于余数)此时会导致不等情况因为是同余与而不是相等,但算法题目里所用的1e9+7一般都相等,因为数够大,所得到的逆元也很大,会进行%运算的!(一般算法题目里不会卡逆元数据的)
6.时间控制再1e8以内可以在1s内算出!
7.~是取反也就是将其二进制代码01呼唤,而-1其所有二机制全为1所以取反后为零,所以也就是解释了为什么i!=-1可以用~i来代替。并且取了负号也就是取反后再加1,所以会将x的第一个1确保为1,而其他的一定是零所以便确保了当&的时候便可以得到其位置及其大小。
8.当我们遇到没有明确告诉输入几个数的时候可以使用scanf,其可以返回输入的数字所以当输入一个数的时候会返回1,而当输入空时将会返回-1而和我们上面的取反~scanf一起用便可以意思为0,然后结合while判定零形成一个完美循环
9.我们学了组合数可以在n个球中不重复的选取m个,但是当我们要解决手里有m个球要放在n个箱子里且不在意顺序只在意每个箱子里有几个的时候我们可以使用“隔板法”!先将m+n然后发现有n+m-1个裂缝,我们在这n+m-1个裂缝中寻找n-1个便可以求出n个箱子,每个箱子装取球的方案数量了!
10.cin会自动帮我们过滤空白字符(当输入字符变量时使用比较方便)
11.补充几个数论小知识(短小精悍):
(1):两个数的最小公倍数是两个数的乘积除以最大公约数
(2):在二维数组中,每条斜率(经过源点)的第一个整数点x与y必互质
(3):两个数除以最大公约数的结果互质
(4):1∼n 中的质数个数约为 n/log(n),而对于每个数平均来说其约数大概有log(n)个
(5):当使用mod时要知道x%y其结果肯定小于等于y的!换句话说也就是一个数组中拿个最小的当做y那么其他数来mod它结果肯定小于等于y,小于的结果不会在数组中出现
12.cin.get()可以获取上一步最后一个或者这一步第一个开始的符号包括空格,换行符,作用与getchar()类似
13.map对所加入的元素进行排序但是unordered_map不进行排序
14.注意:我们所使用的的printf格式化时一般都会四舍五入,当不想使用四舍五入时要特殊化
cout << setiosflags(ios::fixed) << setprecision(n)<<floor(n * 10000)/10000<< endl;
n是需要保留的精度!!!
15.当我们将某个数(十进制)转换为其他进制时,先需要进行一个循环while(n)随后先mod所转换的进制数,然后这个数便是最后一个数(从右向左计算的出的),然后在进行整除进制数即可
16.若两个数字不互质,那么找其最大公约数会导致其不会有解,所以对于两个互质的数一定会存在一个最大的数,其不能被其表示.记住是(n-1)*(m-1)-1;若寻找多个数字所构成的数字时,先看其最大公约数是否不是1,只有为1时才存在且在10000以内
17.当一行中不确定输入多少数字时可以使用getline(cin,line)将整行输入进去,但是由于cin会跳过换行,所以上一行的换行不要忘了要先用一下,然后在继续使用,当需要字符串内的东西时,
可以使用stringstream(ssin,line)将其输入流到ssin内,然后ssin便可以和cin有着相同的作用,当然了只会输入line内的东西,当我们需要将其格式化输入(也就是输入内有很多乱七八糟的字符串,我们可以使用sscanf进行格式化输入)sscanf(line.c_str(),”(格式化输入内容)”,需要输入的变量)而且格式化输入与格式化输出在时间问题上也能减少很多不必要的麻烦
18.当使用(long long)时后面一般不用括号,否则会先算括号内的导致并没有起到作用,谨记!!!