• 初赛Part2


    初赛

    时间复杂度

    主定理(必考)

    [T(n) = aT(frac{n}{b})+f(n) ]

    其中,(n)为问题的规模,(a)为递推下子问题的数量,(frac{n}{b})为每个子问题的规模,(f(n))为递推后做的额外的计算工作

    在以下几种情况中, 主定理有用:

    [egin{cases} 若exists epsilon,使得f(n)=O(n^{log_b^a-epsilon}), &则T(n)=O(n^{log_b^a}) \ 若f(n)=O(n^{log_b^a}), & 则T(n)=O(n^{log_b^a}lg n) \ 若exists epsilon, 使得f(n)=O(n^{log_b^a+epsilon}), &则T(n)=O(f(n)) \ end{cases}]

    感性理解, (n^{log_b^a})(O(f(n)))那个大取决于那个, 相等就乘一个(lg n)

    画一棵递归树, 总共(log_b^n)层, 底层叶子树为(a^{log_b^n}=b^{log_b^alog_b^n}=n^{log_b^a})
    然后不会了

    9. 若某算法的计算时间表示为递推关系式:
    T(N)=2T(N/2)+logN
    T(1)=1
    则该算法的时间复杂度为()。
    A.O(N) B. O(NlogN)
    C.O(Nlog2N) D. O(N2)
    答案: A. (log_b^a=1), 蛋是(log N)没法表示成(N)的指数形式, 不过由主定理可以大致估算在(O(N))左右

    排序

    冒泡排序&插入排序

    冒泡:

    辅助空间:(O(1))
    最好:(O(n))
    最差&平均:(O(n^2))
    稳定


    选择排序

    辅助空间:(O(1))
    最好&最差&平均:(O(n^2))
    不稳定


    归并排序


    辅助空间:(O(n)*logn)
    最好&最差&平均:(O(nlogn))
    稳定


    快速排序


    辅助空间:(O(1)*logn)
    最好&平均:(O(nlogn))
    最差:(O(n))
    不稳定


    堆排序


    辅助空间:(O(1))
    最好&最差&平均:(O(nlogn))
    不稳定

    void swap(int K[], int i, int j)
    {
        int temp = K[i];
        K[i] = K[j];
        K[j] = temp;
    }
    
    //大顶堆的构造,传入的i是父节点
    void HeapAdjust(int k[],int p,int n)
    {
        int i,temp;
        temp = k[p];
        for (i = 2 * p; i <= n;i*=2)    //逐渐去找左右孩子结点
        {
            //找到两个孩子结点中最大的
            if (i < n&&k[i] < k[i + 1])
                i++;
            //父节点和孩子最大的进行判断,调整,变为最大堆
            if (temp >= k[i])
                break;
            //将父节点数据变为最大的,将原来的数据还是放在temp中,
            k[p] = k[i];    //若是孩子结点的数据更大,我们会将数据上移,为他插入的点提供位置
            p = i;
        }
        //当我们在for循环中找到了p子树中,满足条件的点,我们就加入数据到该点p,注意:p点原来数据已经被上移动了
        //若没有找到,就是相当于对其值不变
        //插入
        k[p] = temp;
    }
    
    //大顶堆排序
    void HeapSort(int k[], int n)
    {
        int i;
        //首先将无序数列转换为大顶堆
        for (i = n / 2; i > 0;i--)    //注意由于是完全二叉树,所以我们从一半向前构造,传入父节点
            HeapAdjust(k, i, n);
    
        //上面大顶堆已经构造完成,我们现在需要排序,每次将最大的元素放入最后
        //然后将剩余元素重新构造大顶堆,将最大元素放在剩余最后
        for (i = n; i >1;i--)
        {
            swap(k, 1, i);
            HeapAdjust(k, 1, i - 1);
        }
    }
    
    
    int main()
    {
        int i;
        int a[11] = {-1, 5, 2, 6, 0, 3, 9, 1, 7, 4, 8 };
        HeapSort(a, 10);
    
        for (i = 1; i <= 10; i++)
            printf("%d ", a[i]);
    
        system("pause");
        return 0;
    }
    

    基数排序

    基数(几个桶)(r)
    最大位数(d)
    空间:(O(n+rd))
    最好&最坏&平均:(O(d*(n+r)))
    稳定

     
    /*算法:基数排序*/
     
    #include <iostream>
     
    using namespace std;
    /*********************************************************
    Function:rxsort
    Description:基数排序
    Input:
        数组A[l,h];
        数组中最大元素的位数d,例如最大数为999,则d为3;
        进制数k,如果是10进制数,k为10;
    Output:排序好的数组;
    Others:对数字1234来说,预定第0位为4,第1位为3,依次类推;
    *********************************************************/
    bool rxsort(int A[],int l,int h,int d,int k){
        if(NULL==A||l>h)
            return false;
        int size = h-l+1;
     
        int* counts = new int[k];//用于计数排序的辅助数据,详见计数排序
        int* temp = new int[size];//用于存储重新排序的数组
        int index;
        int pval=1;
        //依次处理不同的位
        for(int i=0;i<d;i++){
            //counts数组清零
            for(int j=0;j<k;j++)
                counts[j] = 0;
     
            for(int j=l;j<=h;j++){
                /*
                1.data[j]/pval:去掉数字data[j]的后i个数,例如:
                当data[j]=1234,i=2时,此时pval=100,data[j]/pval=12;
                2.(data[j]/pval)%k:取数字data[j]/pval的最后一位数
                3.(int)(data[j]/pval)%k:取数字data[j]的第i位数
                */
                index = (int)(A[j]/pval)%k;
                /*
                统计数组A中每个数字的第i位数中各个数字的频数,用于计数排序;
                */
                counts[index]++;
            }
            //计算累加频数,用户计数排序
            for(int j=1;j<k;j++)
                counts[j] = counts[j] + counts[j-1];
            //使用倒数第i+1位数对A进行排序
            for(int j=h;j>=l;j--){
                index = (int)(A[j]/pval)%k;
                temp[counts[index]-1] = A[j];
                counts[index]--;
            }
            //将按第i为数排序后的结果保存回数组A中
            for(int j=0;j<size;j++)
                A[j+l] = temp[j];
            //更新pval
            pval = pval*k;
        }
        delete[] counts;
        delete[] temp;
    }
     
    int main(){
        int A[] = {712,303,4,18,89,999,70,26};
        rxsort(A,0,7,3,10);
        for(int i=0;i<8;i++)
            cout<<A[i]<<" ";
    }
    ————————————————
    版权声明:本文为CSDN博主「BQW_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/bqw18744018044/article/details/81810190
    

    希尔排序


    插入排序的加强,对固定间隔插排,倍减间隔
    空间:(O(1))
    平均:(O(n^{1.3}))
    最差:(O(n^2))
    最好:(O(n))
    不稳定

    #include<iostream>
     
    using namespace std;
    const int increment = 3;
    void shellSort(int a[],int len)
    {
        int temp = 0;
        unsigned gap = len/increment; // 步长初始化
        while(gap) // while gap>=1
        {
            for (unsigned i = gap; i < len; ++i) // 分组,在每个子序列中进行插入排序
            {
                temp = a[i];//将当前的元素值先存起来方便后面插入
                unsigned j = i;
                while (j >= gap && temp < a[j-gap])//寻找插入位置
                {
                    a[j] = a[j - gap];
                    j -= gap;
                }
                a[j] = temp;
            }
            gap = gap/increment;
        }
    }
    int main()
    {
        int array[10] = {4,2,3,1,7,8,6,9,5,10};
        cout<<"排序前的元素:"<<endl; 
        for(int num=0;num<10;num++)
        { 
        	cout<<array[num]<<" ";
    	}
    	cout<<endl; 
        shellSort(array,10);
        cout<<"排序后的元素:"<<endl; 
        for(int num=0;num<10;num++)
        {    	
        	cout<<array[num]<<" ";
    	}
        return 0;
    }
    ————————————————
    版权声明:本文为CSDN博主「tqgwx」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zztingfeng/article/details/98470164
    

    总结

    / 冒泡&插入排序 选择排序 归并排序 快速排序 堆排序 基数排序 希尔排序
    空间 (O(1)) (O(1)) (O(n)*logn) (O(1)*logn) (O(1)) (O(n+r)) (O(1))
    最好 (O(n)) (O(n^2)) (O(nlogn)) (O(nlogn)) (O(nlogn)) (O(d(n+r))) (O(1))
    最差 (O(n^2)) (O(n^2)) (O(nlogn)) (O(n^2)) (O(nlogn)) (O(d(n+r))) (O(n^2))
    平均 (O(n^2)) (O(n^2)) (O(nlogn)) (O(nlogn)) (O(nlogn)) (O(d(n+r))) (O(n^{1.3}))
    稳定? 稳定 不稳定 稳定 不稳定 不稳定 稳定 不稳定

    11、在待排序的数据表已经为有序时,下列排序算法中时间复杂度会减少的是(BD)。
    A 堆排序(无关) B、希尔排序O(n) C、冒泡排序 比较次数不变 D、插入排序O(n)

    逻辑运算

    位运算+逻辑运算的优先级

    逻辑非(!,┐) = 按位反(~)
    >
    位移运算(<<,>>)
    >
    不等号(>=,<=)
    >
    等号(==,!=)
    >
    按位与(&)
    >
    按位异或(^)
    >
    按位或(|)
    >
    逻辑与(&&,∧)
    >
    逻辑或(||,∨)

    A B 合取(wedge) 析取(vee) 蕴含( ightarrow) 双蕴含(leftrightarrow)
    T T T T T T
    T F F T F F
    F T F T T F
    F F F F T T

    C++指针

    P,NP,NPC,NPhard

    https://blog.csdn.net/qq_29176963/article/details/82776543

    及地址

    图论

    注意: 以下判定必须图联通

    汉密尔顿 ?

    汉密尔顿(回)路
    经过图中每个结点恰好一次的(回)路
    汉密尔顿图
    含有 汉密尔顿回路 的图称为汉密尔顿图

    一些性质:

    • 假设 (G) 是一个 (n(n≥2)) 阶简单图,如果 (G)(forall) (u)(v) ,都满足 (deg(u) + deg(v) ≥ n-1), 则 (G) 中存在 哈密尔顿道路 证明略(推荐
    • 假设 (G) 是一个 (n(n≥3)) 阶简单图,如果 (G)(forall) (u)(v) ,都满足 (deg(u) + deg(v) ≥ n)(G) 中存在 哈密尔顿回路
    • 假设 (G) 是一个 (n(n≥3)) 阶简单图,如果 (G) 中任意顶点的次数都至少是 (lceil frac{n}{2} ceil) ,则 (G) 是哈密尔顿图

    欧拉

    欧拉(回)路
    经过图中每条恰好一次的(回)路
    欧拉图
    含有 欧拉回路 的图称为欧拉图

    判定:

    1. 无向连通图存在欧拉路的条件:
    • 所有点度都是偶数,则可取任意一点作为起点。
    • 或者恰好有两个点度是奇数,则奇数点度点一定是欧拉路的起点和终点
    1. 有向连通图存在欧拉路的条件:
    • 每个点的入度等于出度,则存在欧拉回路(任意一点有度的点都可以作为起点)
    • 或者除两点外,所有入度等于出度。这两点中一点的出度比入度大,另一点的出度比入度小,则存在欧拉路。取出度大者为起点,入度大者为终点。

    • 先序遍历+中序遍历=一棵确定的二叉树
    • 后序遍历+中序遍历=一棵确定的二叉树
    • 即有中序遍历才能确定

    下列关于图的说法正确的是():
    A、欧拉图的每一个顶点都能作为某条欧拉闭迹的起点
    B、 一个图有欧拉闭迹当且仅当该图有零个奇点。
    C、 若一个无向图有奇数条边,则它必然不是二分图。
    D、若G是汉密尔顿图,则对G上的汉密尔顿圈C,任意删去n个点,最多可将C划分为n段,反之亦然。
    答案:A
    注意:B不对,还要求连通

    19.下列说法正确的是( ) 算法
    A.SPFA算法无法用来判断给定图是否存在负环
    B. 当图中不存在负权环但是存在负权边,Dijkstra算法一定不能求最短路
    C. 当图中不存在负权环但是存在负权边,bellman-ford算法一定能求最短路
    D.相比于稀疏图,在稠密图上更适合使用SPFA算法
    答案:C
    注意:B不对,由于pq是优化,可以直接考虑n^2版本, 一个点只会去更新其他点一次, 只要构造一张真确距离第二次才能更新某个点的图即可; C正确; D.如完全图, Dij是n ^2而SPFA=nm=n ^3

    14 在一个带权连通图G中,权值最小的边一定包含在G的() 生成树中。
    A. 某个最小 B. 任何最小 C. 广度优先 D.深度优先
    答案: A; (最小生成树) 审清题意

    特殊的计数及常见排列组合问题

    卡特兰数

    前几项为 :

    [egin{aligned} & 1, 2, 5, 14, 42,\ & 132, 429, 1430, 4862, 16796, \ & 58786, 208012, 742900, 2674440, 9694845, dots \ end{aligned}]

    一般递推式:

    [Cat_i = sum_{j=0}^N Cat_j * Cat_{i-j-1} ]

    在数据范围不大,模数不一定是质数 时可用

    一般递推式的解: 通向公式1

    [Cat_i = C(2*n,n) - C(2*n,n+1) ]

    通项公式1化简: 通项公式2

    [egin{aligned} & Cat_i = frac{1}{i+1}C(2*i,i) \ & Cat_i = C(2*i,i) - C(2*i,i+1) \ & Cat_i =frac{(2*i)!}{i! * i!} -frac{(2*i)!}{(i-1)! * (i+1)!} \ & Cat_i = frac{(2*i)!*(i+1)}{i! * i!*(i+1)}-frac{(2*i)!*i}{i!*i! *(i+1)}\ & Cat_i = frac{1}{i+1} * (frac{(2*i)!}{i! * i!}) \ & Cat_i = frac{1}{i+1} * C(2 * i, i) \ end{aligned}]

    通项公式2化简:递推式2

    [egin{aligned} & Cat_i = frac{1}{i+1} * C(2 * i, i) \ & Cat_{i-1} = frac{1}{i} * C(2 * (i-1), i-1) \ & C(2*i,i) = (2*i)! / i! / i! \ & C(2*(i-1),i-1) = (2)*i-2)! / (i-1)! / (i-1)! \ & C(2*i,i) = C(2*(i-1),i-1) * (2*i-1) * (2*i) / i / i \ & Cat_i = frac{1}{i} * C(2 * (i-1), i-1) * frac{i}{i+1} * (2*i-1) * (2*i) / i / i \ & Cat_i = Cat_{i-1} * frac{i}{i+1} * (2*i-1) * (2*i) / i / i \ & Cat_i = Cat_{i-1} * frac{2*(2*i-1)}{i+1}\ end{aligned}]

    一类斯特林数

    第一类斯特林数 (S1(n,m)) 表示的是将 (n) 个不同元素构成 (m) 个圆排列的数目。

    (S1(n, m) = (n - 1) cdot S1(n - 1, m) + S1(n - 1, m - 1))
    即放在之前某个元素左边 + 单独成环
    (S1(n, 0) = 0, S1(1,1) = 1)

    二类斯特林数

    第二类斯特林数 (S2(n,m)) 表示的是把 (n) 个不同元素划分到 (m) 个集合的方案数。

    (S2(n, m) = m cdot S2(n - 1, m) + S2(n - 1, m - 1))
    即放在之前某个集合 + 单独成集合
    (S2(n, 0) = 0, S2(1,1) = 1)

    常见排列组合问题

    八种基本放球问题 *

    1球相同,盒相同,可以为空 *

    • 等价于整数拆分
    • 性质: 将(N)拆分乘不超过(M)个数的方案数,等同于拆分成最大不超过(M)的方案数

    将整数(N)分解为不超过(M)个整数的方案数

    (dp[i][j])(i)分为(j)个数(带0)的方案

    • 假设选出的数非减排列
    • 所有的状态可以从一些子状态整体+1不变转移, 这样不会破坏非严格递增的性质

    即:

    • 子状态增加一个0(空盒)在开头, (dp[i][j-1])
    • 子状态整体(+1), (dp[i-j][j])

    (dp[i][j]=dp[i][j-1]+dp[i-j][j])
    (ans = dp[N][M])

    如果求分成不超过(M)且不重复的方案数,则稍作修改:
    (dp[i][j]=dp[i][j-1]+dp[i-j][j-1])

    2球相同,盒相同,不可以为空 *

    与前一种情况类似, 且更加简单

    • 思路相同, 由于不可以为空, 不能从子状态加一个空盒转移
    • 根据性质, 可以用子状态加一个单独的(1)(最小单位)转移

    即:

    • 子状态加一个单独(1), (dp[i-1][j-1])
    • 子状态整体(+1), (dp[i-j][j])

    (dp[i][j]=dp[i-1][j-1]+dp[i-j][j])
    (ans=dp[N][M])
    同样, 球同盒同可以为空也可用(sum_{i=1}^{M}dp[N][i])计算

    3球不同,盒不同,可以为空 *

    对于每一个球, 都有(N)个盒子任意选择
    (ans=M^N)

    或是二类斯特林数 * 排列 求和
    (ans = sum_{k=1}^{m} S2(n, k) cdot A(m, k))

    4球不同,盒相同,不可以为空 *

    第二类斯特林数

    5球不同,盒不同,不可以为空 *

    第二类斯特林数 * 盒子的排列数

    6球不同,盒相同,可以为空 *

    对二斯求和

    7球相同,盒不同,不可以为空 *

    组合数

    (N)个球中插入(M-1)个隔板,即(C_{n-1}^{m-1})

    递推

    (dp[i][j])代表前(i)个球放入前(j)个盒子的方案数

    • (i)放入当前盒子(j)中,(dp[i-1][j])
    • (j)为新开的盒,(dp[i-1][j-1])

    8球相同,盒不同,可以为空 *

    组合数计算

    可以转化为不空,将球数量增加(M)个,在每个盒子中先放一个
    在进行插板, 即(C_{n+m-1}^{m-1})(最后在拿掉原先的(M)个)

    递推+组合数

    或者(DP)推,先推出不空的(DP),(ans=sigma(DP[n][j]*C_m^{m-j})),比较烦

    错位排列 *

    考虑递推, 设(f[i])为前(i)个数的错排方案数:

    • 由于第(i)个数不能放在自己的位置上, 只能放在([1,i-1])的某个位置(j)
    • 那么原先(j)上的数要重新选择位置

    选择之前的一个数有((i-1))种方案, 而对于重选位置:

    • 位置(j)上的数放在(i)上, 现在剩下((i-2))个数都有限制, (f[i-2])
    • 位置(j)上的数不放在(i)上, 相当于给(j)加了一个限制, 现在((i-1))个数有限制, (f[i-1])

    (f[i]=(i-1)*(f[i-1]+f[i-2]))

    圆排列 *

    两种思路:

    • 固定一个点, 剩下的全排列, ((n-1)!)
    • 先全排列, 因为在圆上, 转一圈都相同, (n!/n)

    重复排列

    (k)种物品, 每一种有(a[i])个, 总共(N)个,求排列的方案数

    即全排列的方案数, 除以每一种内部排列的方案数

    [frac{N!}{prod_{i=1}^{k}a[i]!} ]

    重复组合 * important

    (n)种不同的球, 每种球无限个, 从中选(k)个的方案数

    等价于将(k)次选择(相同)分配到(n)种球上

    (k)个球放到(n)个不同的盒子, 可以为空的情况

    (C_{k-1+n}^{n-1})

    3、3、 给定4个变量x1,x2,x3,x4,满足1<=xi<=10,求方程x1+x2+x3+x4=30的解数()。
    A.282 B.288 C.360 D.362
    答案: 写成(10-x_1+10-x_2+10-x_3)

    (2x^2-3x+1=0), (x=(2+-1)/4) (x1=1/2, x2 = 1)
    (f(n) = A * (frac{1}{2})^{n-1} + B)

    [egin{cases} A + B = 1 \ 1/2 * A + B = 3/2 end{cases}]

    (B = 2)

    数列

    平方和公式

    [sum_{i=1}^{n} i^2 = frac{n(n + 1)(2n + 1)}{6} ]

    证明:

    [egin{aligned} & (n + 1) ^ 3 = n ^ 3 + 3n ^ 2 + 3n + 1 \ & (n + 1) ^ 3 - n ^ 3 = 3n ^ 2 + 3n + 1 \ & (n + 1) ^ 3 - n ^ 3 + n ^ 3 - (n - 1) ^ 3 + dots + 2 ^ 3 - 1 ^ 3 = 3sum_{i=1}^{n} i^2 + 3sum_{i=1}^{n} i + n\ & n ^ 3 + 3n ^ 2 + 3n = 3sum_{i=1}^{n} i^2 + frac{3n(n + 1)}{2} + n\ & sum_{i=1}^{n} i^2 = frac{2n ^ 3 + 3n ^2 + 2n}{6} = frac{n(n + 1)(2n + 1)}{6} \ end{aligned}]

    特征根求通向+10-x_4=10$

    转化成(y_1+y_2+y_3+y_4=10) 其中(0le y le 9), 用隔板法(C_{10+4-1}^{4-1} - 4) , (-4)表示减去某一个(y=10)的方案

    15、 四面体的顶点和各棱中点共10个点,从中取4个不共面的点,不同的取法有多少种?

    • 总共: (C_{10}^{4})
    • 对于每一面, 选择这一面的(4)个, 不合法 : (4*C_{6}^{4})
    • 对于每一条边, 选(3)个点, 然后选择对面那一面上横边的中点, 不合法(6*1)
    • 选择一个由中位线组成的平行四边形, 不合法:(3)

    减去不合法的方案: (C_{10}^{4} - 4 * C_{6}^{4} - 6 - 3 = 141)

    16、 以一个正方体的顶点为顶点,能组成多少个不同的四面体? 类似上一题:

    • 总共: (C_8^4)
    • 选择一个面, 不合法: 6
    • 选择一个对角面, 不合法: 6

    58

    17、 6本不同的书全部分给5名同学每人至少一本,有多少种不同的分法? 5个人中, 有一个人有2本, 其他人都是1本

    • 先选择一个有2本的人, (5)
    • 在6本中选择2本给这个人, (C_6^2)
    • 剩下的4本和4个人, 进行全排列匹配(A_4^4)

    (ans=5*C_6^2*A_4^4=1800)

    20、 8本不同的书分给3名同学,其中1名同学2本、另两人3本,有多少种不同分法?

    • 先选一个2本的人, 给他2本书, (C_3^1*C_8^2)
    • 剩下2个3本的人, 这时不需要在从中选一个人了, 因为(C_6^3)已经确定两个人的分配了, 一个人3本

    (ans=C_3^1*C_8^2*C_6^3=1680)

    23、 7个相同的小球,任意放入4个不同的盒子中,共有多少种不同的方法?

    转化为不为空的情况, 在每个盒子中放一个, 于是在(10)个球中插(3)个隔板

    (ans=C_{10}^3=120)

    28、 10双不相同的鞋子混装在一只口袋中,从中任取4只,4只鞋子恰有2只成双的方法数?

    • 先选一对, ("10")
    • 剩下18只, 选择了某一只, 与其成对的就不能选, (18*16/2)

    (ans=10*18*16/2=1440)

    31、 6本不同的书分给甲、乙、丙三人,每人至少一本,有多少种不同的分法?

    只知道分类讨论怎么做:

    37、 一些学生接受调查,这些学生中准备参加会计师考试的有63人,准备参加英语考试的有89人,准备参加计算机考试的有47人,三种都准备参加的有24人,只准备参加两种考试的有46人,不参加其中任何一种考试的有15人。请问有多少学生接受调查?
    注意 : 是只参加2种的有...人, 画图易得至少参加2人的有46+243人, 有容斥可得答案为(63+89+47)-(46+243)+24+15 = 120

    27、10双不相同的鞋子混装在一只口袋中,从中任取4只,4只鞋子没有成双的方法数?
    答案:

    1. (20*18*16*14/A_4^4=3360)
    2. (C_{20}^4 - C_{10}^{1}*18*16/2 - C_{10}^{2}=3360)

    数列

    平方和公式

    [sum_{i=1}^{n} i^2 = frac{n(n + 1)(2n + 1)}{6} ]

    证明:

    [egin{aligned} & (n + 1) ^ 3 = n ^ 3 + 3n ^ 2 + 3n + 1 \ & (n + 1) ^ 3 - n ^ 3 = 3n ^ 2 + 3n + 1 \ & (n + 1) ^ 3 - n ^ 3 + n ^ 3 - (n - 1) ^ 3 + dots + 2 ^ 3 - 1 ^ 3 = 3sum_{i=1}^{n} i^2 + 3sum_{i=1}^{n} i + n\ & n ^ 3 + 3n ^ 2 + 3n = 3sum_{i=1}^{n} i^2 + frac{3n(n + 1)}{2} + n\ & sum_{i=1}^{n} i^2 = frac{2n ^ 3 + 3n ^2 + 2n}{6} = frac{n(n + 1)(2n + 1)}{6} \ end{aligned}]

    特征根求通向

    一阶

    待定系数法

    二阶




    Lucas定理

    (C(n, m) mod p = C(n / p , m / p) cdot C(n mod p, m mod p) mod p)

    哈希

    二次探查法

    (+1^2, -1^2, +2^2, -2^2, +3^2, -3^2)

    平均查找长度

    成功~~~

    找到第一个空的位置
    按照顺序插入元素, 例如这个位子还没有放过, 直接放即可, 长度为(1), 若已经放过, 而下一个位子没放, 则长度为(2)

    {7, 14}, mod 7

    0 1
    7 14
    1 2

    平均的分母为已插入的个数

    不成功~~~

    找到第一个非空的位置
    按照位置去找, 注意定义为不在散列表中的元素, 初始位置为([0, mod- 1])

    {7、8、30、11、18、9、14}, mod 7

    0 1 2 3 4 5 6 7 8 9
    7 14 8 11 30 18 9
    3 2 1 2 1 5 4 - - -

    平均的分母为mod

    哈弗曼编码 ?

    (n = 2n_0 - 1)

    概率期望

    17. 随机抛硬币, 连续三次为 "正反正" 时就停止, 问期望抛几次
    答案: 设E[i]表示匹配了前(i)位时到达目标的期望步数, 画树形图可得

    [egin{cases} E0 = (E1 + E0) / 2 + 1 \ E1 = (E2 + E1) / 2 + 1 \ E2 = (E0 + E3) / 2 + 1 \ E3 = 0 \ end{cases}]

    解得E0 = 10

    错题

    其他错题(算数, 推理)

    9、孙某和张某是考古学家老李的学生。有一天,老李拿了一件古物来考验两人,两人都无法验证出来这件古物试谁的。老李告诉了孙某拥有者的姓,告诉张某拥有者的名,并且在纸条上写下以下几个人的人名,问他们知道谁才是拥有者?
    纸条上的名字有:沈万三、岳飞、岳云、张飞、张良、张鹏、赵括、赵云、赵鹏、沈括。
    孙某说:如果我不知道的话,张某肯定也不知道。
    张某说:刚才我不知道,听孙某一说,我现在知道了。
    孙某说:哦,那我也知道了。
    请问:那件古物是谁的(B)?
    A、赵括 B、岳飞 C、岳云 D、赵鹏
    (1)剩下 岳, 赵
    (2)排除 岳, 赵 中重名的
    (3)排除 岳飞 赵括 赵鹏 中重姓的

    include

    using namespace std;
    int f(int n,int k){
    if (n == k || k == 0) return 1;
    else return f(n - 1, k) + f(n - 1, k - 1);
    }
    int main() {
    int n,k,m;
    cin >> n >> k;
    cout << f(n,k);
    return 0;
    }
    6 此题的时间复杂度为多项式级别,请判断是否正确(B)?
    A. 正确 B.错误
    相当于O(ans)

    5.将数组{8, 23, 4, 16, 77, -5, 53, 100}中的元素按从大到小的顺序排列,每次可以交换任意两个元素,最少需要交换( )次。
    找出三个环, 答案应当是每个环的大小-1加起来

    2.如果在某个进制下等式(7*7=41)成立,那么在该进制下(12*12=)( )也成立。
    A.100 B. 144 C. 164 D.196
    算错, 可以由前一个等式得他是(12)进制, 或者可以将后一等式写成((X+2)^2=X^2+4X+4)直接得到

    4、若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为( )
    A. 1,2,3 B. 9,5,2,3
    C. 9,5,3 D. 9,4,2,3
    答案: [1,18]->9->[1,8]->4->[1,3]->2->[3,3]->3

    3、给定4个变量x1,x2,x3,x4,满足1<=xi<=10,求方程x1+x2+x3+x4=30的解数()。
    A.282 B.288 C.360 D.362
    答案: A
    前两个分一组, 后两个分一组, 算出每一组和为多少的方案数, 然后乘起来相加

    https://blog.csdn.net/qq_34454069/article/details/81055250

    草稿写好看点!!!方便检查---

  • 相关阅读:
    Mongo 配置文件 [www]
    网络上最完整的网络克隆教程
    perl操作MongoDB
    [C#项目开源] MongoDB 可视化管理工具 (2011年10月-至今)
    maven ClassNotFoundException: org.springframework.web.context.ContextLoader
    执行update操作的话,就会报“Connection is read-only. Queries leading to data modification are not allowed”的异常。
    解压war包
    删除文件夹
    查看端口是否被占用
    springmvc 注解
  • 原文地址:https://www.cnblogs.com/Kuonji/p/11839507.html
Copyright © 2020-2023  润新知