![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数论
文章平均质量分 64
数论刷题
荼白777
这个作者很懒,什么都没留下…
展开
-
阶乘分解(考虑每个数是谁的因子)
传送门题面思路直接暴力的对[1,n][1,n][1,n]每个数去分解的话,时间复杂度是O(nn)O(n\sqrt{n})O(nn)的,会TLE;这种思路也就是看看每个数有哪些质因数;我们现在反过来思考,每个数能够成为哪些数的质因数;也就是反过来枚举;比如素数ppp,有n/pn/pn/p个倍数,它们包含一个ppp;但是p2p^2p2也是包含ppp的,因此我们还需要加上n/p2n/p^2n/p2;依次类推,p3,p4,...p^3,p^4,...p3,p4,...都是需要计算的;即对原创 2022-04-08 21:33:59 · 504 阅读 · 0 评论 -
卡特兰数列(Catalan)
简介卡特兰数又称卡塔尔数,是组合数学中一个常出现在各种计数问题中的数列。其前几项为: 1, 2, 5, 14, 42, 132, 429, …朴素递推公式快速计算公式应用栈进出问题二叉树结点问题括号序列问题括号化问题:一个合法的表达式由()()()包围,()()()可以嵌套和连接,如:(())()(())()(())()也是合法表达式,现给出nnn对括号,求可以组成的合法表达式的个数;假设当前要计算的是第kkk个(((;其左边有k−1k-1k−1个(((,右边有n−kn-kn−k原创 2022-03-04 16:23:59 · 2197 阅读 · 0 评论 -
欧拉函数模板
定义111到nnn中与nnn互质的数的个数称为欧拉函数,记为φ(n)\varphi(n)φ(n);比如φ(6)=2\varphi(6)=2φ(6)=2计算公式例题传送门Code#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10;int phi(int原创 2021-11-25 20:03:17 · 212 阅读 · 0 评论 -
约数的模板
试除法求约数题面传送门Code#include <iostream>#include <cstdio>#include <algorithm>#include <vector>using namespace std;typedef long long ll;const int N = 1e5 + 10;void solve(){ vector<int> res; int n; cin >原创 2021-11-17 22:08:42 · 196 阅读 · 0 评论 -
质数的模板
试除法判断质数题面传送门Code#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10;bool jg(int x){ if(x < 2) return false; for(int i=2;i<=x/i;++i){原创 2021-11-17 21:09:46 · 191 阅读 · 0 评论 -
数字转换 —— 数论+ 树形DP
题面题目思路一个数的约数之和是固定的,而这个约数之和可能是多个数的约数和;因此如果我们约数之和 →→→ 约数连一条边,必然可以形成树的形状(并且题目说了不能出现重复数字);这样问题就转化成了求树的直径;接下来是关于约数和部分;如果我们暴力的去筛每个数的因子,时间复杂度为O(nn)O(n \sqrt{n})O(nn)我们可以用埃氏筛的思想,考虑枚举某个数能成为谁的因子;也就是枚举倍数;这样时间复杂度为O(nlogn)O(nlogn)O(nlogn)当然还有线性筛的方法O(n)O(n原创 2021-10-16 16:18:25 · 98 阅读 · 0 评论 -
求组合数模板
C(n,k)=C(n−1,k−1)+C(n−1,k)C(n,k) = C(n-1,k-1) + C(n-1,k)C(n,k)=C(n−1,k−1)+C(n−1,k)我们将nnn个元素分成两组第一组n−1n-1n−1个,第二组111个从中取出kkk个元素(一共有C(n,k)C(n,k)C(n,k)种)现在取法有两种从第一组中取出kkk个,方法有C(n−1,k)C(n-1,k)C(n−1,k)种从第一组中取出k−1k-1k−1个,从第二组中取出111个,方法有C(n−1,k−1)(n-1,k-1)原创 2021-10-06 12:24:37 · 408 阅读 · 0 评论 -
乘法逆元
一、线性递推时间复杂度O(n)例题&Code洛谷P3811#include <iostream>using namespace std;typedef long long ll;const int N = 3*1e6 + 10;ll inv[N];int main(){ ll n,p; cin >> n >> p; //初始化 inv[0]=0; inv[1]=1; cout <<原创 2021-04-12 20:14:07 · 110 阅读 · 0 评论 -
c++向上取整
方法一方法二⌈nm⌉=⌊n+m−1m⌋\lceil \frac{n}{m} \rceil=\lfloor \frac{n+m-1}{m} \rfloor⌈mn⌉=⌊mn+m−1⌋方法三、直接if-else判断比如要除3向上取整if(sum % 3 == 0) return sum / 3;else return sum / 3 + 1;原创 2021-06-15 19:56:42 · 1742 阅读 · 0 评论 -
组合数求和
由图可以看出S(i)=i∗S(i−1)+1S(i)=i*S(i-1)+1S(i)=i∗S(i−1)+1+1是因为后一个比前一个多一项,仔细观察上图+1是因为后一个比前一个多一项,仔细观察上图+1是因为后一个比前一个多一项,仔细观察上图S(i)=Ai0+Ai1+Ai1+...+AiiS(i)=A_i^0+A_i^1+A_i^1+...+A_i^iS(i)=Ai0+Ai1+Ai1+...+AiiCodefor(ll i=1;i<=1e5;++i){ s[i]=(s[i-.原创 2021-06-21 12:21:09 · 866 阅读 · 0 评论 -
线性筛获取约数个数
前提知识首先对于一个大于1正整数n可以分解质因数:n=p1d1+p2d2+...+pkdk,其中pi为素数n = p_1^{d_1} + p_2^{d_2} + ... + p_k^{d_k},其中p_i为素数n=p1d1+p2d2+...+pkdk,其中pi为素数那么根据排列组合,可以知道约数的个数factor(n)=(1+d1)(1+d2)...(1+dk)约数的个数factor(n) = (1+d_1)(1+d_2)...(1+d_k)约数的个数factor(n)=(1+d1原创 2021-05-29 21:22:47 · 175 阅读 · 0 评论 -
龟速乘&快速幂
龟速乘其实本质我认为跟快速幂一样,都是利用二进制而已;龟速乘//a*b%pll q_mul(ll a,ll b,ll p){ ll ret = 0; ll base = a; while(b){ if(b&1){ ret+=base; ret%=p; } base+=base; base%=p; b>>=1; }原创 2021-08-16 21:22:42 · 73 阅读 · 0 评论 -
AcWing97------约数之和
题面首先我们知道一个数可以分解成以下形式X=p1a1∗...∗pnanX=p_1^{a_1}*...*p_n^{a_n}X=p1a1∗...∗pnan则约数和为(1+p11+p12+...+p1a1)∗...∗(1+pn1+pn2+...+pnan)(1+p_1^1+p_1^2+...+p_1^{a_1})*...*(1+p_n^1+p_n^2+...+p_n^{a_n})(1+p11+p12+...+p1a1)∗...∗(1+pn1+pn2+...+pnan)对于xy=(p原创 2021-08-16 21:11:22 · 82 阅读 · 0 评论