随手记
1)在计算几何中,对于整点个数的求法:
皮尔定理:
2S = 2a + b - 2,其中S表示多边形面积,a表示多边形内的整点个数,b位边上的整点个数;
关于边上的整点个数求法:
通常以边在x,y轴上的投影长度进行计算,比如某边E对应x轴长度为a,对应y轴长度为b,则E边上整点个数 b(E) = gcd(a, b)+1,我是这样想的:
求出gcd(a, b),则有(a', b') * gcd(a, b) = (a, b),而a'与b'必为整点且互素且与(a, b)在一条边上(即不可再有满足条件的更小的整点),那么gcd(a, b)作为倍数即可表示整点个数,再加上边上的
另一个端点即+1,就为边上的点个数;
计算边上的整点个数时应当注意重叠问题。
2)平方和求和公式:
相关证明:https://baike.baidu.com/item/%E5%B9%B3%E6%96%B9%E5%92%8C%E5%85%AC%E5%BC%8F/3264126
立方和公式:
相关证明:https://baike.baidu.com/item/%E7%AB%8B%E6%96%B9%E5%92%8C%E5%85%AC%E5%BC%8F/10557155
3)博弈论
尼姆博弈:有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
对于n堆物品,第i堆物品有ai件;
以https://www.nowcoder.com/acm/contest/86/E为例:
代码:
1 #include "stdio.h" 2 #include "iostream" 3 #include "algorithm" 4 #include "math.h" 5 #include "stdlib.h" 6 using namespace std; 7 typedef long long ll; 8 int main(){ 9 //freopen("test.txt", "r", stdin);/////////////// 10 ll s[100005], n, q, op1, op2, ans; 11 while(cin>>n>>q){ 12 ans = 0; 13 for(int i = 0; i < n; i++){ 14 cin>>s[i]; 15 ans ^= s[i]; 16 } 17 while(q--){ 18 cin>>op1>>op2; 19 op1--; 20 ans ^= s[op1]; 21 ans ^= op2; 22 s[op1] = op2; 23 cout<<(ans ? "Kan":"Li")<<endl; 24 } 25 } 26 return 0; 27 }
最后ans为0,则先手必败。
4)对于一个b进制下的一个分数p / q,判断其是否为一个有限小数的方法:
先将其转化为一个最简分式 [即q/gcd(p, q)],若为有限小数,那么有正整数r使得 q | b^r(根据小数的计算方法),也就是说q的所有质因数都为b的质因数(因为所有数都可以用质数表示);
最后可以用一个while实现。
5)扩展欧几里得算法:
求解一组正整数 (x,y)解使得对应于一对正整数(a,b)有 a*x + b*y = (a, b); 该解一定存在(贝祖等式)。
C++代码:
int exgcd(int a, int b, int &x, int &y){ if(!b){ x = 1, y = 0; return a; } int q = exgcd(b, a % b, y, x); //q为最大公因数 y -= a/b*x; return q; } ////找到公因数之后回溯的同时进行逆推计算系数
6)① a, b为两个正整数,则2^a - 1 被 2^b - 1 除的最小非负余数为 2^r - 1,其中 r 是a 被 b除的最小非负余数:
证明:当a < b 时 明显成立;反之,有 a = q*b + r(0 <= r <=b), 即有 2^a - 1 = 2^r((2^b)^q - 1) + 2^r - 1 = q1(2^b - 1) + 2^r - 1,
其中 q1 = 2^r((2^b)^(q-1) + ... + 2^b + 1) 为整数,结论成立;
② 设 a, b 是两个正整数,则2^a - 1 和 2^b - 1的最大公因数为2^(a,b) - 1;(由欧几里得除法和)① 可得。
③ 则有 正整数 2^a - 1 和 2^b - 1 的最大公因数是 2^(a,b) - 1(证明:因为 (2^a - 1, 2^b - 1)= 2^(a,b) - 1 , 而2^(a,b) - 1 即 (a, b)= 1).
7)整数分解定理:
对于正合数 n > 1, 如果存在整数 a, b 使得 n | a^2 - b^2,但 n ト a - b,n ト a + b,
则 (n, a-b)和(n, a+b)都是 n 的真因数(非1或n, 反证法)。
8)素数定理:
设 φ(x) 为不大于 x 的素数个数;
契比谢夫不等式:当x >= 2, (ln 2 /3)*(x / ln x) < φ(x) < 6*ln 2 (x / ln x);
素数定理:lim(x→∞)(φ(x) / (x / ln x)) = 1;
9)为什么OSI七层模型中只有数据链路层即将传输的数据添加报尾?
来自WikiPedia:
- 数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成帧。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。
分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制(media access control,MAC)子层。
也就是说数据链路层所谓倒数第二层对分组的数据添加报尾,从而形成一个帧,实现对数据的分割。接收方也可据此进行识别。
10)VBE Decode
只要将 0~0xff 范围内的字符全部使用VBS的Encoder编码,得到(原文 --- 密文)映射关系,就可以解码VBE得到VBS。
相关脚本比较多,比如:http://didierstevens.com/files/software/decode-vbe_V0_0_1.zip
从中摘的一小段:
... ... result = '' index = -1 for char in data.replace('@&', chr(10)).replace('@#', chr(13)).replace('@*', '>').replace('@!', '<').replace('@$', '@'): byte = ord(char) if byte < 128: index = index + 1 if (byte == 9 or byte > 31 and byte < 128) and byte != 60 and byte != 62 and byte != 64: char = [c for c in dDecode[byte]][dCombination[index % 64]] result += char ... ...
11)...
本文来自博客园,作者:Bl0od
转载请注明原文链接:https://www.cnblogs.com/zUotTe0/p/8894691.html