首页 > 编程语言 >常用算法模版

常用算法模版

时间:2023-09-23 13:44:49浏览次数:33  
标签:常用 ch return int 模版 Tp 算法 num const

常用算法模版

今天学会在 https://godbolt.org/ 看汇编了。顺便卡了下常数,以及简单的(不是)压行。

快读

signed read() {
    signed num = 0, flag = 1; char ch = getchar();
    for (; !isdigit(ch); ch = getchar()) if (ch == '-') flag = -1;
    for (; isdigit(ch); ch = getchar()) num = num * 10 + ch - '0';
    return num * flag;
}

若读数非负:

unsigned uread() {
    unsigned num = 0; char ch = getchar();
    while(!isdigit(ch)) ch = getchar();
    while(isdigit(ch)) num = num * 10 + ch - '0', ch = getchar();
    return num;
}

卡常

template<typename _Tp> _Tp _max(const _Tp a, const _Tp b) { return a > b ? a : b; }
template<typename _Tp> _Tp _min(const _Tp a, const _Tp b) { return a < b ? a : b; }
template<typename _Tp> _Tp _abs(const _Tp x) { return x < 0 ? -x : x; }

快速幂

int qpow(int a, int b, int p) {
    int r = 1;
    for (; b; b >>= 1) (b & 1 ? r = r * a % p : true), a = a * a % p;
    return r;
}

欧几里得算法

int gcd(int a, int b) {
    while (b != 0) tie(a, b) = make_tuple(b, a % b);
    return a;
}
int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) { x = 1, y = 0; return a; }
    int d = exgcd(b, a % b, y, x); y -= a / b * x;
    return d;
}

线性同余方程

若 \(n \mid \gcd(a, b)\)(有解),则可以删去第 \(3\) 行。

int lieu1(int a, int b) {
    int x, y, d = exgcd(a, b, x, y);
    if (d != 1) return -1;
    return (x % b + b) % b;
}
int lieu(int a, int b, int n) {
    int x, y, d = exgcd(a, b, x, y);
    if (n % d != 0) return -1;
    int t = b / d; return (x % t + t) % t;
}

乘法逆元

若 \(a \perp m\)(有解),则可以删去第 \(3\) 行。

int inv(int a, const int m) {
    int x, y, d = exgcd(a, m, x, y);
    if (d != 1) return 0;
    return (x % m + m) % m;
}
int inv(int a, const int m) {
    int x, y;
    exgcd(a, m, x, y);
    return (x % m + m) % m;
}

若有 \(m \in \mathbb P\):

int inv(int a, const int p) {
    return qpow(a, p - 2, p);
}

求组合数

int comb(int a, int b, const int p) {
    return a < b ? 0 : fr[a] * sv[b] % p * sv[a - b] % p;
}
int lucas(int a, int b, const int p) {
    int r = 1;
    while (a && b) r = r * comb(a % p, b % p, p) % p, a /= p, b /= p;
    return r;
}

欧拉函数

int euler_phi2(int n) {
    int ans = n;
    for (int i = 2; i * i <= n; i++) { if (n % i == 0) {
        ans = ans / i * (i - 1);
        while (n % i == 0) n /= i;
    }}
    if (n > 1) ans = ans / n * (n - 1);
    return ans;
}

扩展中国剩余定理合并

void merge(int &a1, int &m1, int a2, int m2) {
    int g = gcd(m1, m2), m = m1 / g * m2;
    int p, q; exgcd(m1 / g, m2 / g, p, q);
    p = p * m1 % m, p = p * ((a2 - a1) / g) % m;
    a1 = (a1 + p + m) % m, m1 = m;
}

标签:常用,ch,return,int,模版,Tp,算法,num,const
From: https://www.cnblogs.com/RainPPR/p/algorithm-templates.html

相关文章

  • 算法题——实现类似parseInt的方法
    Scannersc=newScanner(System.in);Stringstr="";while(true){System.out.println("请输入");Stringstr1=sc.nextLine();if(str1.length()<1||str1.length()>10||str1.charAt(0)=='0'){System.out.......
  • 【算法】哈希表
    1哈希表理论基础1.1哈希表哈希表是根据关键码的值而直接进行访问的数据结构。一般哈希表都是用来快速判断一个元素是否出现集合里。1.2哈希函数哈希函数如下图所示,通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值。如果ha......
  • 【算法】字符串
    1反转字符串题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用O(1)的额外空间解决这一问题。1.双指针classSolution:defreverseString(self,s:List[str])......
  • 网络拥塞控制算法总结-PolyCC
    字节跳动在SIGCOMM'23以Poster形式提交了一篇论文《PolyCC:Poly-AlgorithmicCongestionControl》,试图将各种拥塞控制算法整合到一个统一的框架里。其理由是近40年来各种渠道发布的各种拥塞控制算法,没有一种算法能解决所有网络场景(不同的应用,不同的流量模型等)。 如上图,PolyCC......
  • 【算法】链表
    1链表理论基础链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。链表中的节点在内存中不是连续分布的,而是散乱分布在内......
  • 代码随想录算法训练营-动态规划-1|509. 斐波那契数、70. 爬楼梯
    509. 斐波那契数 1classSolution:2deffib(self,n:int)->int:3ifn<=2:4returnn56prev1,prev2=0,17for_inrange(2,n+1):8sum_value=prev1+prev29prev1,......
  • 【算法】数组
    1数组理论基础数组是存放在连续内存空间上的相同类型数据的集合。数组下标都是从0开始的数组内存空间的地址是连续的在删除或者增添元素时,需要移动其他元素的地址:C++要注意vector和array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。数组的元素是不能......
  • CentOS 7 的几个常用的 yum 源
    CentOS7的几个常用的yum源这些yum源都是稳定可靠的,您可以根据实际情况选择使用。使用方法是将对应的源文件复制到/etc/yum.repos.d/目录下,并进行相应的配置。比如以阿里云为例,sudowget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.......
  • 代码随想录算法训练营day17 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.
    110.平衡二叉树classSolution{public:intgetHeight(TreeNode*node){if(node==NULL)return0;intleftHeight=getHeight(node->left);if(leftHeight==-1)return-1;intrightHeigh......
  • LZW字典压缩算法及例程
    字典压缩算法是一种数据压缩方法,其基本原理是将重复出现的字符串或者片段用一个短的代表符号来表示,从而减小数据的存储空间。字典压缩算法通常用于无损压缩数据。一种常见的字典压缩算法是Lempel-Ziv-Welch(LZW)算法。该算法通过构建和更新一个字典来实现压缩。初始时,字典中包含......