随手记

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)...

posted @ 2018-04-21 00:23  Bl0od  阅读(243)  评论(0编辑  收藏  举报