参考: "卡特兰数" 很经典的问题有:合法括号匹配、矩阵从左下角到右上角不走对角线、二
"D. 站军姿" 参考: "随机在圆上生成n个点,这n个点在同一半圆的概率是多少?" 思路:直接利用公式,随机在圆上生成n个点,这n个点在同一半圆的概率是$\frac{n}{2^{n 1}}$ ,求逆元的时候直接用费马小定理即可 代码: cpp // Created by CAD on 2019/9
"Fibonacci again and again" 参考: "SG函数和SG定理【详解】" 思路:这是比较简单的SG定理的运用,SG定理—— 游戏和的SG函数等于各个游戏SG函数的Nim和 如果一个位置 的SG值为0,那么这个点就为必败点 ,否则就是必胜点 必败点:用N表示 必胜点:用P表示 对
求 n 以内的素数和以及素数个数复杂度:\(O(n^{\frac{3}{4}})\)// Created by CAD#include <bits/stdc++.h>#define ll long longusing namespace std;ll check(ll v,ll n,ll ndr,ll nv) { return v>=ndr?(n/v-1):(nv-v);}
图中长度为k的路径的计数 $G_{k_1+k_2}[u][v]=\sum^n_{w=1}G_{k_1}[u][w] G_{k_2}[w][v]$ 经
from kuangbin包含了 + - * / ^ % = > >> << == 运算符的重载,可用int char* BigNum调用构造函数#define MAXN 9999#define MAXSIZE 100000#define DLEN 4class BigNum{public: int a[MAXSIZE]; int
"小V和方程" 需要用到的知识: "小球与盒子" 冷静分析,仔细思考
二次剩余 参考: 二次剩余Cipolla算法学习笔记 #include <bits/stdc++.h> using namespace std; const int mod=1e9+9; namespace TwoRemain { template <typename A, typename B>
"A Mis
"递归实现指数型枚举" 状态压缩: 分别遍历每一个状态即可。
快速乘 参考: "小技巧1——长整型:64位整数的乘法模运算" 当 a 和 b 都大于1e9的时候,为了防止溢出,就需要一个算法,叫做快速乘。 实现方法一: 将乘法转换为加法,并且伴随着取模操作的进行,可以保证不会溢出。 而为了加速加法操作,可以利用快速幂的思路,对加法操作进行优化,复杂度为$O(l
"Blocks" 利用递推的想法得到一个递推公式,在本质上它是一个 dp 的题目,但是由于 n 过大,不能使用 dp 解决,所以将递推公式化为矩阵乘法,所以可以用矩阵快速幂进行优化。
逆序对 所求的交换次数等价于满足$ia_j$的$(i,j)$的数对的个数(这种数对的个数叫做
矩阵快速幂 矩阵快速幂可以作为一种优化技巧,当知道第$i+1$项和第$i$项之间的递推式的时候,可以将其转化为矩阵运算,然后用矩阵快速幂进行优化。尤其适用于,要求第 n 项的值,而 n 很大的时候。
不论如何取都不能取胜。 进一步我们发现 若 ,先取者拿走 个,那么后者再拿 个 ; 先取者再拿走 个 最后总能造成 剩下 的局面。 因此,此时先手有必赢策略。 相对应的,若 那
`From kuangbin` 支持加法,乘法, `char BigInt` 初始化
D - 小兔的棋盘思路:很裸的卡特兰数但如果直接上,会爆 long long,所以需要用一些技巧两种写法: 1.使用卡特兰数最基本的公式:\[f(n)=\displaystyle\sum_{i=0}^{n-1} f(i)*f(n-i-1) \]注:f(0)=1,f(1)=1 代码:// Created by CAD on 2019/8/15.#include <
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号