数论
Aurora141592
这个作者很懒,什么都没留下…
展开
-
[数论]余数之和(数论分块)
可能会有点用,另外quickpow常数有点大啊,如果用的都是一样的一定要提前计算。http://www.51nod.com/Challenge/Problem.html#!#problemId=1225#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 1e9 + 7, mod2 = 998244353, inf = 0x3f3f3f3f;ll quickpow(ll x,原创 2021-01-13 21:13:36 · 128 阅读 · 1 评论 -
[数论]扩展欧拉定理
ab ≡ {ab mod ϕ(m)gcd(a,m) = 1abgcd(a,m) ≠ 1 ∧ b < ϕ(m)ab mod ϕ(m) + ϕ(m)gcd(a,m) ≠ 1 ∧ b ≥ ϕ(m)a^b~\equiv~\begin{cases}a^{b~mod~\phi(m)} &am原创 2021-01-13 21:13:04 · 74 阅读 · 0 评论 -
[HAOI2008]硬币购物(dp预处理 + 容斥原理 + 思维)
https://www.luogu.org/problemnew/show/P1450硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。先dp预处理出假设每种硬币有无限个买价值为i的东西的硬币的方案数(完全背包),然后就有两个很思维的东西了。首先,因为硬币数量有限,根据容斥原理,只要把无限的方案减去第一种硬币超过限制的方案、减去第二种硬币超过限制的方案,减去第三种硬币超过限制的方案、减去第四种硬原创 2021-01-13 21:10:51 · 228 阅读 · 0 评论 -
CSU – 1810 – Reverse(计数 + 贡献)
http://fastvj.rainng.com/contest/299737#problem/D把一串数字中的所有区间(有序)分别翻转求和取模,这种题要单独算每位的贡献。对于第i个位置,有i * (i – 1) / 2 + (n – i) * (n – i + 1) / 2个区间不会影响到它,有min(j, n – i + 1)个区间会把j(j < i)翻转到i,有min(i, n - j + 1)个区间会把j(j > i)翻转到i,还有对称轴就在i,有min(i, n – i +原创 2021-01-13 21:10:10 · 93 阅读 · 0 评论 -
[数论]快速乘
当你要计算两个数相乘取模并且相乘会爆long long还不能用__int128的时候,就需要用到快速乘了(n, k >= 0)。原理就是把k二进制分解一下就完事了。ll Slow_Mul(ll n, ll k, ll mod){ ll ans = 0; while(k){ if(k & 1) ans = (ans + n) % mod; k >>= 1; n = (n + n) % mod; } return原创 2021-01-09 09:52:22 · 87 阅读 · 0 评论 -
NOWCODER – 小A的数学题(数论)
https://ac.nowcoder.com/acm/contest/549/J∑i=1n∑j=1mgcd(i,j)2\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^2i=1∑nj=1∑mgcd(i,j)2我第一次化简的时候把d从gcd里提出来了写的贼麻烦。这个数论太简单了,我太蠢了,主要是存个容斥板子。这里有个小结论,可以再优化下时间,还不是很能证明出来。∑i=1n∑j=1n[gcd(i,j)=1]=2⋅∑i=1nϕ(i)–1\sum_{i=1}^{n}\sum_原创 2021-01-09 09:44:28 · 92 阅读 · 0 评论 -
[组合数学]Catalan数
http://www.51nod.com/Challenge/Problem.html#!#problemId=1120写到这题的时候突然恍然大悟Catalan数到底有啥用了。就像出栈序列,要是有元素想出栈,那栈内必须要有元素。再比如,机器人走方格不能走到对角线以下,那就要求往右走的要恒大于等于往下走的。 就像出栈序列,入栈的总个数一定要恒大于等于出栈的总个数。OEIS: Catalan numbers: C(n) = binomial(2n, n) / (n + 1) = (2n)! / (n! (n原创 2021-01-08 13:57:38 · 133 阅读 · 0 评论 -
[数论]Lucas定理
卢卡斯定理一行代码搞定,是用来求大组合数取小模的注意:不要把全局变量p覆盖了,覆盖就炸了。还有,0的阶乘等于1啊,fac[0]=1啊,别忘了。https://www.luogu.org/problemnew/show/P3807#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 2e5 + 5;int p;ll fac[maxn];ll quickpow(ll x,原创 2021-01-08 13:56:45 · 99 阅读 · 0 评论 -
51nod – 最复杂的数(质因数分解)
https://www.51nod.com/Challenge/Problem.html#!#problemId=1060输出小于等于n的拥有最多约数个数中最小的那个数。存个模板int big, prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};ll ans, x;void dfs(ll cur, int i, int limit, int num){ if (num > big || (n原创 2021-01-08 13:53:41 · 512 阅读 · 0 评论 -
final-数论(积性函数、线性筛、杜教筛、莫比乌斯反演)
数论分块:(\lfloor \frac n i \rfloor)最多只有(2 · \lfloor \sqrt n \rfloor)个取值。for(ll l = 1, r; l <= n; l = r + 1) { r = n / (n / l); res -= (r - l + 1) * S(n / l);}常见的积性函数:φ(n) -欧拉函数μ(n) -莫比乌斯函数,关于非平方数的质因子数目gcd(n,k) -最大公因子,当k固定的情况d(n) -n的正因子数目σ(原创 2021-01-06 21:24:37 · 115 阅读 · 0 评论 -
[数论]\sum_{i=1}^n i · [gcd(i,n)=1]
https://ac.nowcoder.com/acm/contest/317/Dhttps://blog.csdn.net/qq_39897867/article/details/81122606首先i和n互质,那么n-i和n也互质。∑i=1ni⋅[gcd(i,n)=1]\sum_{i=1}^n i · [gcd(i,n)=1]i=1∑ni⋅[gcd(i,n)=1]=12⋅(∑i=1ni⋅[gcd(i,n)=1]+∑i=1n(n−i)⋅[gcd(n−i,n)=1])=\frac 1 2 · (\原创 2021-01-06 21:09:39 · 1176 阅读 · 0 评论 -
[数论]数的分解
约数枚举vector<int> vi;void dis(int x){ for (int i = 1; i * i <= x; ++i){ if (x % i == 0){ vi.push_back(i); if (i != x / i) vi.push_back(x / i); } }}整数分解map<int, int> mii;void dis(int x){原创 2021-01-04 10:35:26 · 119 阅读 · 0 评论 -
[数论]逆元
模数为0则逆元不存在。x的模m逆存在且唯一的充要条件为x与m互质(gcd(x, m) = 1)除法逆元有两种计算方法。费马小定理(模数一定为质数):(a / b) % p = a * b^(p – 2) % p;如果模数不为质数,但gcd(a, m) == 1,请使用欧拉定理aϕ(m)≡1(mod m)a^{\phi(m)} ≡ 1 (mod\ m)aϕ(m)≡1(mod m)如果模数不为质数,且gcd(a, m) != 1,请使用扩展欧拉定理扩展欧几里得(不限制模数):h原创 2021-01-04 10:31:32 · 166 阅读 · 0 评论 -
[容斥原理]2357的倍数
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1284SB写法,多个数要计算lcm容斥。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 26;int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}int lcm(int a, int原创 2021-01-03 14:46:45 · 570 阅读 · 0 评论 -
[算法]矩阵快速幂
注意:如果有n的k次方,那就把n的k次方写成k个n相乘,然后补k行k列就好了。求(a_n = a_{n – 1} + 2 * a_{n – 2} + n^3)首先我们需要知道立方和完全展开式:((a – b)^3 = a^3 – 3 a^2 b + 3 a b^2 – b^3)然后配就行了((i + 1)^3 = i^3 + 3 i^2 + 3 i + 1)。有一个要注意的地方是,最后要拿转移矩阵的n次方的第一行乘上初始列才是答案。(推完之后发现这矩阵好像杨辉三角形,如果有更高次项应该能按杨辉三角原创 2021-01-03 14:39:13 · 187 阅读 · 0 评论 -
[数论]中国剩余定理
模数要两两互质,否则请使用EXCRThttps://www.51nod.com/onlineJudge/questionCode.html#!problemId=1079#include<iostream>using namespace std;typedef long long ll;void extgcd(ll a, ll b, ll &g, ll &x, ll &y){ if (b == 0) g = a, x = 1, y = 0;原创 2021-01-03 14:38:12 · 101 阅读 · 2 评论 -
[数论]原根
设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。对于(a,n)=1的整数,满足(a^r≡1 (mod\ n))的最小整数r,称为a模n的阶。https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1135#include<iostream>#include<vector>using namespace std;typedef long long ll;int mod;vec原创 2020-12-31 09:57:56 · 425 阅读 · 0 评论 -
[思维]约瑟夫环求最后一个出列的人
假设编号为0到n – 1,对于固定的k,定义f(n)为n个人组成的环最后一个出列的人,f(1) = 0,假设已经知道了f(n),当有n + 1个人的时候,第一个出列的人的编号一定是k – 1,然后剩下n个人了,我们已经知道n个人最后一个出列的人的编号,但是此时报数的人从第0个变成了第k个,所以此时最后一个出列的人就是(f(n) + k) % n,即f(n + 1) = (f(n) + k) % n,再把编号加1就是答案了。#include<bits/stdc++.h>using namesp原创 2020-12-31 09:57:19 · 534 阅读 · 0 评论 -
[数论]斯特林公式求阶乘长度
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1130#include<bits/stdc++.h>using namespace std;const double pi = 3.14159265358979, de = log10(2.71828182845905);int main(){ int t; cin >> t; while (t--){ in原创 2020-12-31 09:56:45 · 79 阅读 · 0 评论 -
[黑科技]线性递推板子
#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <cassert>using namespace std;#define rep(i,a,n) fo原创 2020-12-31 09:54:42 · 74 阅读 · 0 评论 -
POJ2689 – Prime Distance(区间筛)
http://poj.org/problem?id=2689自闭了两道数学题搞一上午,我好菜啊。2019.04.18:因为正整数x的质因子不会超过(\sqrt x),所以(\sqrt x)以内的质数可以筛出([1, x])的所有质数。for (ll i = 2; i * i <= U; ++i){ if (!s[i]){ for (ll j = 2 * i; j * j <= U; j += i) s[j] = 1;//筛[2, sqrt(U)] f原创 2020-12-28 14:10:46 · 83 阅读 · 0 评论 -
[数论]扩展欧几里得算法
http://poj.org/problem?id=2115void extgcd(ll a, ll b, ll &g, ll &x, ll &y){ if (b == 0) g = a, x = 1, y = 0; else{ extgcd(b, a % b, g, y, x); y -= (a / b) * x; }}此算法能计算出ax + by = gcd(a, b)的整数解。可以解决ax + by = c的问原创 2020-12-28 14:06:01 · 84 阅读 · 0 评论 -
[结论]一些结论
(gcd(2^a – 1, 2^b – 1) = 2^{gcd(a, b)} – 1)(gcd(fib[a], fib[b]) = fib[gcd(a, b)])斯特林公式:(n!)约等于(\sqrt{2 · \pi · n} · (\frac e n)^n)(\pi = 3.14159265358979, e = 2.71828182845905)a & b <= min(a, b) ∑i=1ni2=n⋅(n+1)⋅(2⋅n+1)6\sum_{i = 1} ^ {n} i^2 = \原创 2020-12-28 14:04:17 · 76 阅读 · 0 评论 -
[算法]01分数规划
https://blog.csdn.net/hzoi_ztx/article/details/54898323http://www.51nod.com/Challenge/Problem.html#!#problemId=1257给定n个二元组((value_i, cost_i)),(value_i)是选择此二元组获得的价值(非负),(cost_i)是选择此二元组付出的代价(非负),设(x_i (x_i \in{{0,1}} ))代表第i个二元组的选与不选,最大(小)化下式r=∑valuei⋅xi∑c原创 2020-12-28 13:35:51 · 68 阅读 · 0 评论 -
洛谷1403 – 约数研究(数论)
https://www.luogu.org/problemnew/show/P1403f(n)表示n的约数个数,现在给出n,要求求出f(1)到f(n)的总和。首先把前n个自然数的因数按顺序写出来,就会发现因数i的出现次数为floor(n / i),所以答案就是for (int i = 1; i <= n; ++i) ans += floor(n / i), 但是这样要循环n次。我们可以再优化一下,我们发现只有当i为n的因数时floor(n / i)的值才会更新2019.04.18:就是个数论分块原创 2020-12-28 13:33:31 · 290 阅读 · 0 评论 -
[数论]数论四大定理
威尔逊定理、欧拉定理、孙子定理(中国剩余定理)、费马小定理并称数论四大定理。威尔逊定理:若p是质数,那么(p–1)! ≡ −1 (mod p)若p是质数,那么(p – 1) !\ ≡\ -1\ (mod\ p)若p是质数,那么(p–1)! ≡ −1 (mod p)欧拉定理:aϕ(n) ≡ 1 (mod n)a^{\phi(n)}\ ≡\ 1\ (mod\ n)aϕ(n)原创 2020-11-04 21:52:00 · 978 阅读 · 1 评论 -
[数论]埃拉托斯特尼筛法
把质数放进一个容器里,无聊写的。vector<int> prime;bool tp[maxn];void init(){ for (int i = 2; i < maxn; ++i){ if (!tp[i]){ prime.emplace_back(i); for (int j = 2; j * i < maxn; ++j){ tp[j * i] = 1;原创 2020-11-04 21:40:01 · 156 阅读 · 0 评论 -
[数论]扩展欧拉定理
ab ≡ {ab mod ϕ(m)gcd(a,m) = 1abgcd(a,m) ≠ 1 ∧ b < ϕ(m)ab mod ϕ(m) + ϕ(m)gcd(a,m) ≠ 1 ∧ b ≥ ϕ(m)a^b~\equiv~\begin{cases}a^{b~mod~\phi(m)} &am原创 2020-09-20 11:01:22 · 179 阅读 · 0 评论 -
[数论]快速乘
当你要计算两个数相乘取模并且相乘会爆long long还不能用__int128的时候,就需要用到快速乘了(n, k >= 0)。原理就是把k二进制分解一下就完事了。ll Slow_Mul(ll n, ll k, ll mod){ ll ans = 0; while(k){ if(k & 1) ans = (ans + n) % mod; k >>= 1; n = (n + n) % mod; } return原创 2020-11-04 21:23:41 · 126 阅读 · 0 评论 -
1238 最小公倍数之和 V3
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 1e9 + 7, inf = 0x3f3f3f3f;ll quickpow(ll x, ll k){ ll res = 1; while(k){ if(k & 1) res = (res * x) % mod; k >>= 1, x = (x * x) % m原创 2020-11-04 21:26:50 · 102 阅读 · 0 评论 -
final-数论(积性函数、线性筛、杜教筛、莫比乌斯反演)
数论分块:⌊ni⌋\lfloor \frac n i \rfloor⌊in⌋最多只有2⋅⌊n⌋2 · \lfloor \sqrt n \rfloor2⋅⌊n⌋个取值。for(ll l = 1, r; l <= n; l = r + 1) { r = n / (n / l); res -= (r - l + 1) * S(n / l);}常见的积性函数:φ(n) -欧拉函数μ(n) -莫比乌斯函数,关于非平方数的质因子数目gcd(n,k) -最大公因子,当k固定的情况原创 2020-11-04 21:26:56 · 126 阅读 · 0 评论 -
[数论]\sum_{i=1}^n i · [gcd(i,n)=1]
https://ac.nowcoder.com/acm/contest/317/Dhttps://blog.csdn.net/qq_39897867/article/details/81122606首先i和n互质,那么n-i和n也互质。∑i=1ni⋅[gcd(i,n)=1]\sum_{i=1}^n i · [gcd(i,n)=1]i=1∑ni⋅[gcd(i,n)=1]=12⋅(∑i=1ni⋅[gcd(i,n)=1]+∑i=1n(n−i)⋅[gcd(n−i,n)=1])=\frac 1 2 · (\原创 2020-07-10 15:49:42 · 1651 阅读 · 0 评论 -
[数论]伯努利数
线性求逆元快速版#include<bits/stdc++.h>#define MOD mod#define MAX maxnusing namespace std;typedef pair<int, int> pii;typedef long long ll;const double eps = 1e-6;const int maxn = 2e3 + 10, inf = 0x3f3f3f3f, mod = 1e9 + 7;ll quickpow(ll x, ll k原创 2020-07-04 16:40:10 · 409 阅读 · 0 评论 -
HDU – 4713 – Permutation(数论 + 完全背包)
????/acm.hdu.edu.cn/showproblem.php?pid=4713构造任意个数使得它们的和等于n并且它们的积最大。#include<vector>#include<queue>#include<stdio.h>#include<map>#include<set>#include<string.h>#include<algorithm>#include<iostream>#原创 2020-07-04 16:34:47 · 282 阅读 · 0 评论 -
洛谷 P5520 [yLOI2019] 青原樱(组合数学 + 不互质逆元)
s://.luogu.com.cn/problem/P5520我组合数学也太菜了吧,这题思路相当简单。第一种想法是:m个树占m个位置,然后拿m – 1个位置填在m个树之间,然后就是一个n – 2 * m + 1个球放m + 1个盒子里,盒子可以为空的放法数了,结果就是Cn–m+1mC_{n – m + 1}^{m}Cn–m+1m。另一种思路更简单,就是先抽出m – 1个位置出来,然后剩下的位置里选m个,直接就是Cn–m+1mC_{n – m + 1}^{m}Cn–m+1m种了,然后把这m – 1个位置原创 2020-07-04 16:33:28 · 355 阅读 · 0 评论 -
51nod – 约瑟夫环 V2(数论)
N个人坐成一个圆环(编号为1 – N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。结论:int ans = 0;for (int i = 1; i <= n; ++i) ans = (ans + k) % i;cout << ans % n + 1 << endl;忘了很久以前我是怎么推出来了的,然后看了讨论区发现真正取模的次数是O(klogn)O(k log n)O(klogn)的,然后就可以跳着算了。ll ans =原创 2020-07-04 16:26:43 · 177 阅读 · 0 评论 -
[数论]逆元
模数为0则逆元不存在。x的模m逆存在且唯一的充要条件为x与m互质(gcd(x, m) = 1)除法逆元有两种计算方法。费马小定理(模数一定为质数):(a/b)%p=a∗bp–2(a / b) \% p = a * b^{p – 2} % p(a/b)%p=a∗bp–2如果模数不为质数,但gcd(a, m) == 1,请使用欧拉定理aϕ(m)≡1(mod m)a^{\phi(m)} ≡ 1 (mod\ m)aϕ(m)≡1(mod m)如果模数不为质数,且gcd(a, m) !=原创 2020-05-09 11:48:41 · 179 阅读 · 0 评论