整理的算法模板合集: ACM模板


目录

  • Part 6.2.1 素数
    • P4718 【模板】Pollard-Rho算法
    • P1075 质因数分解
    • P2441 角色属性树
    • P5535 【XR-3】小道消息

题单链接:我是传送门

Part 6.2 整除相关

与整除相关的概念有很多,比较常用的有素数,最大公约数和欧拉函数。

Part 6.2.1 素数

素数,指的是除 1 和它本身之外没有其他约数的数。

  • P4718 【模板】Pollard-Rho算法
  • P1075 质因数分解
  • P2441 角色属性树
  • P5535 【XR-3】小道消息

P4718 【模板】Pollard-Rho算法


直接上模板

#include <bits/stdc++.h>
using namespace std;
#define rg register
#define RP(i,a,b) for(register int i=a;i<=b;++i)
#define DRP(i,a,b) for(register int i=a;i>=b;--i)
#define fre(z) freopen(z".in","r",stdin),freopen(z".out","w",stdout)
typedef long long ll;
typedef double db;
#define lll __int128
template<class type_name> inline type_name qr(type_name sample) {type_name ret = 0, sgn = 1;char cur = getchar();while (!isdigit(cur))sgn = (cur == '-' ? -1 : 1), cur = getchar();while (isdigit(cur))ret = (ret << 1) + (ret << 3) + cur - '0', cur = getchar();return sgn == -1 ? -ret : ret;
}ll max_factor;inline ll gcd(ll a, ll b) {if (b == 0)return a;return gcd(b, a % b);
}inline ll qp(ll x, ll p, ll mod) {ll ans = 1;while (p) {if (p & 1)ans = (lll)ans * x % mod;x = (lll)x * x % mod;p >>= 1;}return ans;
}
inline bool mr(ll x, ll b) {ll k = x - 1;while (k) {ll cur = qp(b, k, x);if (cur != 1 && cur != x - 1)return false;if ((k & 1) == 1 || cur == x - 1)return true;k >>= 1;}return true;
}
inline bool prime(ll x) {if (x == 46856248255981ll || x < 2)return false;if (x == 2 || x == 3 || x == 7 || x == 61 || x == 24251)return true;return mr(x, 2) && mr(x, 61);
}
inline ll f(ll x, ll c, ll n) {return ((lll)x * x + c) % n;
}
inline ll PR(ll x) {ll s = 0, t = 0, c = 1ll * rand() % (x - 1) + 1;int stp = 0, goal = 1;ll val = 1;for (goal = 1; goal <<= 1, s = t, val = 1) {for (stp = 1; stp <= goal; ++stp) {t = f(t, c, x);val = (lll)val * abs(t - s) % x;if ((stp % 127) == 0) {ll d = gcd(val, x);if (d > 1)return d;}}ll d = gcd(val, x);if (d > 1)return d;}
}inline void fac(ll x) {if (x <= max_factor || x < 2)return;if (prime(x)) {max_factor = max_factor > x ? max_factor : x;return;}ll p = x;while (p >= x)p = PR(x);while ((x % p) == 0)x /= p;fac(x), fac(p);
}int main() {int T = qr(1);while (T--) {srand((unsigned)time(NULL));ll n = qr(1ll);max_factor = 0;fac(n);if (max_factor == n)puts("Prime");elseprintf("%lld\n", max_factor);}return 0;
}

P1075 质因数分解


一个神奇的做法

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>using namespace std;
const int N = 500007, M = 500007,INF = 0x3f3f3f3f;
typedef long long ll;ll read()
{ll x = 0, f = 1;char ch = getchar();while(ch > '9' || ch < '0'){if(ch == '-')f = -1; ch = getchar();}while(ch <= '9' && ch >= '0'){x = x * 10 + ch - '0';ch = getchar();}return x * f;
}ll n, m;
ll get_euler(ll n)
{ll res = n;for(int i = 2; i * i <= n; ++ i){if(n % i == 0){res = res / i * (i - 1);while(n % i == 0)n /= i;}}if(n > 1)res = res / n * (n - 1);return res;
}int main()
{n = read();ll x = get_euler(n);ll add = n - x + 1;ll a = (add + sqrt(add * add - 4 * n)) / 2;ll b = add - a;printf("%lld", max(a, b));return 0;
}

P2441 角色属性树


题目“翻译”:
给你一棵树,涉及两种操作:

  1. 修改某个节点u的权值;
  2. 找某个节点u的满足他们的最大公约数 <1\lt 1<1 的最近祖先。

数据非常随机,纯暴力可过屮

kkk的题解看不懂 呜呜呜~

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>using namespace std;
const int N = 500007, M = 500007, INF = 0x3f3f3f3f;
typedef long long ll;int n, m, k;
int fa[N];
int a[N];int gcd(int a, int b)
{if(b == 0) return a;return gcd(b, a % b);
}int Find(int x)
{for(int y = fa[x]; y; y = fa[y]) {if(gcd(a[x], a[y]) > 1) return y;}return -1;
}int main()
{scanf("%d%d", &n, &k);for(int i = 1; i <= n; ++ i){scanf("%d", &a[i]);}for(int i = 1; i <= n - 1; ++ i) {int x, y;scanf("%d%d", &x, &y);fa[y] = x;}for(int i =1; i <= k; ++ i) {int op;scanf("%d", &op);if(op == 1) {int x;scanf("%d", &x);printf("%d\n", Find(x));}else {int x, y;scanf("%d%d", &x, &y);a[x] = y;}}return 0;
}

P5535 【XR-3】小道消息


伯特兰—切比雪夫定理说明:若整数n > 3,则至少存在一个质数p,符合n < p < 2n − 2。另一个稍弱说法是:对于所有大于1的整数n,至少存在一个质数p,符合n < p < 2n。

首先注意一点,质数并不是和所有的数都互质,质数的倍数不和它互质。

我们题目中给的每个人身上的数都是i+1i+1i+1,也就是说数字是 2 ~ n + 1。

  • 所以我们对于这个 kkk ,如果 k+1k+1k+1 是质数:
  1. 如果2 ~ n+1之间不存在k+1的倍数,那么显然2 ~ n + 1 中所有的数都和k + 1互质,也就是说这个人第一天就会把答案所有的人,答案是1。
  2. 如果2 ~ n + 1之间存在 k + 1 的倍数,很明显第一天除了 k + 1 的倍数以外的所有的数都会被告知,k + 1 的倍数在第二天也会被其他的数告知,所以答案是2。
  3. 怎么判断2 ~ n+1之间是否存在k+1的倍数?只需要判断2∗(k+1)>n+1→2∗k+1>n2*(k + 1) > n + 1→2*k + 1 >n2∗(k+1)>n+1→2∗k+1>n。
  • 如果 k+1k+1k+1 不是质数,那么需要两天时间,第一天告诉所有和k+1互质的数,一定有质数,第二天告诉所有的数

根据伯特兰·切比雪夫定理,当 2×(k+1)∈{1,2,…n}2\times(k+1)\in\{1,2,\ldots n\}2×(k+1)∈{1,2,…n} 时,必定有一个质数p满足 k+1<p<2k+2k+1\lt p\lt2k+2k+1<p<2k+2 ,屡次迭代必然有一个质数 ppp 满足 2p>n2p\gt n2p>n 从而推得 ppp 与 1−n1-n1−n 的非自己本身的数互质 因此 gcd(k+1,p)=1gcd(k+1,p)=1gcd(k+1,p)=1 第一次必然可以将消息传给 ppp 所以需要 222 天。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>using namespace std;
const int N = 500007, M = 500007, INF = 0x3f3f3f3f;
typedef long long ll;ll n, m, k;bool check_prime(ll x)
{if(x == 1)return false;if(x == 2)return true;for(ll i = 2; i <= sqrt(x); ++ i) if(x % i == 0)return false;return true;
}int main()
{scanf("%lld%lld", &n, &k);if(check_prime(k + 1) && 2 * k + 1 > n) printf("1");else printf("2");return 0;
}

【数学专题】整除相关 - 素数相关推荐

  1. 数论学习书籍及信奥中的数学之数论相关资料

    1.数学女王的邀请 初等数论入门(2020.07) 2.初中数学竞赛中的数论初步(第2版)-2020.04 3.初等数论(2015.11) 4.数论初步(2023.01) 5.初等数论(第3版)-20 ...

  2. 训练指南——数学专题一的总结

    差不多一个星期过去了,在这一个多星期里,我做了一个数学专题和两场训练赛,要说对自己的感觉,只能说很差劲,开始的时候以为环境会比现在宽松很多,后来才发现想法是错误的,实验室室里室一种紧张的气氛,感觉就像 ...

  3. 《算法竞赛中的初等数论》(一)正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  4. 信奥中的数学 数论篇 相关资料汇总(2022.07.07)

    数论入门书籍推荐 数论入门书籍推荐_dllglvzhenfeng的博客-CSDN博客_数论入门应该看什么书 数学女孩系列书籍 数学女孩系列书籍_dllglvzhenfeng的博客-CSDN博客 信息学 ...

  5. 信息学奥赛数学一本通 数论相关题目

    ​[数论]教堂 [数论]教堂_LZK1997的博客-CSDN博客 [数论]教堂_AKone123456的博客-CSDN博客 [数论]密码 [数论]密码_)NCuyALnA$Ke的博客-CSDN博客 [ ...

  6. 数论与数学专题练习(一)(201802~201805)

    数论与数学专题练习(一)(201802~201805) 手动博客搬家: 本文发表于20180224 00:33:28, 原地址https://blog.csdn.net/suncongbo/artic ...

  7. sql相同顺序法和一次封锁法_数学专题 | Ep01 隔板法的妙用

    数学专题(一)  隔板法的妙用 浓度常见哪些问题? 排列组合分堆?涂色?到底掌握透彻了吗? 解析几何与韦达定理? 公式总是记不住?应用题还不会解? 除了写作(写作听我的).逻辑(逻辑说)专题外,本周起 ...

  8. 牛客竞赛数学专题班生成函数I 题解

    牛客竞赛数学专题班生成函数I 题解 题单链接 背包 题目链接 题意 总共有888个物品,对于每个物品的选法都有要求,问带nnn个物品的方案数. 思路 构造生成函数,并将等比级数转为合式(∏i=0xi= ...

  9. 数论[计算机数学专题(5)]

    哒哒哒!掌握一种心理学的学习概念,人的认知是不断成长的,不必要因为一时的失意,而否定您. 数学不好,也没关系,一起成长.早在出生起,我们每天笨拙的咿呀咿呀学汉语与走路,我们最终都学会了.为什么,因为那 ...

最新文章

  1. 等待队列wait queue
  2. Git 的安装与初次使用 —— Git 学习笔记 03
  3. javascript 的默认对象
  4. 如何正确创建DLL和使用DLL
  5. 打破双亲委派么,怎么打破_质量保证被打破。 这就是我们如何使其像其他所有东西一样敏捷。...
  6. VirtualBox安装Centos6.8出现——E_INVALIDARG (0x80070057)
  7. 今天研究了一下关于Asp.net文件上传时的内存消耗问题
  8. 后台代码之买票和查找核实航班的代码
  9. java加法运算表达式_java运算符和表达式
  10. clickhouse聚合函数之groupBitmap
  11. AndroidStudio关联GitHub
  12. 101 Symmetric Tree
  13. 第一行代码 Hello world
  14. java8 lambda 处理分类和子分类的技巧
  15. Linux下oracle11Gr2(64位)安装说明
  16. C语言中常用math函数
  17. Failover feature ‘ANSYS electronics_desktop‘ is not available. No valid FLEXlm servers specified.解决方
  18. 004 无损分区4k对齐
  19. 算法题涂小天与他的画
  20. JWT有状态登陆与无状态登陆

热门文章

  1. 用OpenCV实现页面扭曲矫正
  2. 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
  3. 编程能力如何突飞猛进?
  4. 接口的特点及,抽象类与接口的区别
  5. iOS 10道细节面试题
  6. 搭建网站必不可少的知识3
  7. spring cloud的网关服务Zuul
  8. Android Studio中新建和引用assets文件
  9. 2015.4.10-SQL 高级查询(二)
  10. poco vs Boost