紫薯第10章数学 kaungbin专题14数论基础
杂谈
- kuangbin14数论Harmonic Number LightOJ - 1234
分段打表 + 欧拉爷爷o(1).(第一次触及了欧拉常熟)
10.1.1 && 10.1.2
欧几里德算法、唯一分解定理、筛法、快速幂
唯一分解定理(sqrt(n)sqrt(n)sqrt(n))
vector<int>prime,prime_num;
int sum, cnt;
void divide(int x){prime.clear();prime_num.clear();for(int i = 2; i * i <= x; i++){if(x%i==0){prime.pb(i); cnt = 0;while(x%i == 0){x /= i;cnt++;}prime_num.pb(cnt);}}if(x>1){prime.pb(x); prime_num.pb(1);}
}
约数个数&&约数之和
n=p1a1p2a2p3a3...pnann = {p_1}^{a_1}{p_2}^{a_2}{p_3}^{a_3}...{p_n}^{a_n}n=p1a1p2a2p3a3...pnan
约数个数
ans(n)=(a1+1)(a2+1)(a3+1)...(an+1)ans(n) = (a_1+1)(a_2+1)(a_3+1)...(a_n+1)ans(n)=(a1+1)(a2+1)(a3+1)...(an+1)
约数之和
ans=(p10+p11+...p1a1)(p20+p21+p2a2)...(pn0+pn1+pnan)ans = ({p_1}^{0}+{p_1}^{1}+...{p_1}^{a_1})({p_2}^{0}+{p_2}^{1}+{p_2}^{a_2})...({p_n}^{0}+{p_n}^{1}+{p_n}^{a_n})ans=(p10+p11+...p1a1)(p20+p21+p2a2)...(pn0+pn1+pnan)
- int内最多的约数个数为1536
- 1-n内的所有约数个数,ans=n1+n2+n3+...+nnans=\frac{n}{1}+\frac{n}{2}+\frac{n}{3}+...+\frac{n}{n}ans=1n+2n+3n+...+nn,调和级数,加欧拉常数。欧拉常数,在这篇blog有
判断质数
bool isprime(int n){if(n<2)return false;for(int i = 2; i <= n/i; i++){if(n%i == 0)return false;}return true;
}
埃氏筛法(nloglognnloglog_nnloglogn)
const int maxn = 1e6+10;
int vis[maxn];
vector<ll> prime_orl;
void table(){for(int i = 2; i < maxn; i++){if(!vis[i]){prime_orl.pb(i);for(int j = 2*i; j<maxn; j += i)vis[j] = 1;}}
}
线性筛法(nnn)
注意事项,那种除法判断边界
,一定要加==
# include <bits/stdc++.h>
using namespace std;
const int N =1e6+10;
bool st[N];
int primes[N], cnt;
int table(int n){cnt = 0;st[1] = 1;//注意这里!!!!!for(int i = 2; i <= n; i++){if(!st[i])primes[cnt++] = i;for(int j=0; i<=n/primes[j]; j++){//注意这里要是ist[i*primes[j]] = 1;if(i%primes[j]==0)break;}}return cnt;
}
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n; cin>>n;cout<<table(n)<<endl;return 0;
}
证明
n只会被最小质因子筛掉。
- iii % pj==0p_j == 0pj==0
pjp_jpj一定是iii的最小质因子,pjp_jpj一定是pj∗ip_j*ipj∗i的最小质因子。 - iii % pj!=0p_j != 0pj!=0
pjp_jpj一定小于iii的所有质因子,pjp_jpj也一定是pj∗ip_j*ipj∗i的最小质因子。 - 对于一个合数x,假设pjp_jpj是x的最小质因子,当iii枚举到x/pjx/p_jx/pj的时候,一定被筛掉。
快速幂(logk)
分析
- aka^kak
- 可以拆成,a20,a21,a22,a23,...a2logk,a^{2^0},a^{2^1},a^{2^2},a^{2^3},...a^{2^{log_k}},a20,a21,a22,a23,...a2logk
- 之后再看k的二进制下,是否有1,有就乘上相应的权重。(我悟了。。。)
ll pow(ll x, ll p, ll mod){ll res = 1;while(p){if(p&1)res = res * x % mod;p >>= 1;x = x * x %mod;}return res;
}
gcd(logn)
- d∣ad|ad∣a 和d∣bd|bd∣b 那么 d∣a+bd|a+bd∣a+b,那么d∣ax+byd|ax+byd∣ax+by
- 即对于a%b = a−⌊ab⌋∗ba-\lfloor \frac{a}{b}\rfloor * ba−⌊ba⌋∗b
- 另c=⌊ab⌋c = \lfloor \frac{a}{b}\rfloorc=⌊ba⌋,那么a%b=a-c*b;
- 即证明gcd(a,b)=gcd(b,a%b);
int gcd(int a, int b){if(b == 0) return a;return gcd(b, a%b);
}
费蜀定理
对于任意正整数a,b,一定存在非零整数x,y,使得ax+by=(a,b)。
exgcd
- a mod b = a−⌊ab⌋∗ba-\lfloor \frac{a}{b} \rfloor *ba−⌊ba⌋∗b
- 对于ax+by=(a,b),可得by + (a−⌊ab⌋∗ba-\lfloor \frac{a}{b} \rfloor *ba−⌊ba⌋∗b)x = (a,b)
- 那么整理得ax + b(y-⌊ab⌋∗x\lfloor \frac{a}{b} \rfloor *x⌊ba⌋∗x) = (a,b)。
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;
}
上式只可以求出一个解,但是有了一个解后,可以求出多个解。
x=x0+k∗bdx=x_0+k*\frac{b}{d}x=x0+k∗db
y=y0−k∗ady=y_0-k*\frac{a}{d}y=y0−k∗da
求正整数解
’
1.对于一个方程ax+by=c,任意一个解可以写成。
2. (x0∗cg+k∗bgx_0*\frac{c}{g} + k*\frac{b}{g}x0∗gc+k∗gb,y0∗cg−k∗agy_0*\frac{c}{g} - k*\frac{a}{g}y0∗gc−k∗ga)
3. 对于二式中x0x_0x0和y0y_0y0为ax+by=(a,b)的解。
假如求出来的x为负,那么可以( x%bg\frac{b}{g}gb+ bg\frac{b}{g}gb )% bg\frac{b}{g}gb
更加一般地
( x%b+ b )% b
exgcd的应用
,解线性同余方程组。
ax ≡b\equiv b≡b( mod m)
等价于
ax = ym + b
另y′=−yy' = -yy′=−y
即ax+y′m=bax +y'm = bax+y′m=b
上式子有解
当且仅当 (a,m)∣b(a,m)|b(a,m)∣b
模线性方程组
exgcd的一个应用求逆元
.(p不是质数时,用这种方法)
ax≡\equiv≡ 1(mod p)
鄙人,之于exgcd地一点体会(下面有一道中国剩余定理的不互质版本,可以结合使用)
- 首先对于一个方程组,exgcd求完后,相当于求出了m1在模m2下的逆元
- 对于一个求完的解,根据上式子说明只是 x∗m1≡1(modm2)x*m1\equiv1(\mod m2)x∗m1≡1(modm2)时的一个解,所以记得扩大。(下面用只有两个方程组的crt来说明)
long long x = (a1-a2)/g*in%(m2/g) + (m2/g)) % (m2/g);//crtx = x*m1 + a;
kuangbin14数论Prime Independence LightOJ - 1356
本题考察了质因数分解和 二分图最大匹配kuangbin14数论Aladdin and the Flying Carpet LightOJ - 1341
本题考察了质因数分解 和 筛法。kuangbin14数论Sigma Function LightOJ - 1336
唯一分解+思维+等比数列求和公式。kuangbin14数论Pairs Forming LCM LightOJ - 1236
唯一分解&&LCMkuangbin14数论Leading and Trailing LightOJ - 1282
快速幂 + 数学logkuangbin14数论[Goldbach
s Conjecture LightOJ - 1259 ](https://blog.csdn.net/qq_45377553/article/details/109787932) 筛法水题(
注意时间和空间`)easy870. 约数个数
乘法原理&&质因数分解。easy871. 约数之和(乘法原理&&unordered_map<int,int>)
乘法原理&&质因数分解。normal 质数中的质数(质数筛法) 51Nod - 1181
两次线性筛法 + 范围的限定difficult分解质因数 LibreOJ - 6466
椭圆质因数分解&&int128
difficult质数检测 V2 51Nod - 1186
java很容易,c++要写大数(当然__int128也可以)和随机算法difficult 204. 表达整数的奇怪方式
中国剩余定理。
10.2.2
欧拉函数
phi[n] 。1-n里与n互质的个数。
const int maxn = 1e6+10;
ll phi[maxn];
ll a[maxn];
void table(int n){fori(i,2,maxn)phi[i] = 0;phi[1] = 0;///initfori(i,2,maxn){if(!phi[i]){for(int j = i; j <maxn; j += i){if(!phi[j])phi[j] = j;phi[j] = phi[j] / i * (i-1);}}}
}
线性筛法求phi
ll get_euluer(int n){phi[1] = 1;for(int i = 2; i <= n; i ++ ){if(!st[i]){primes[cnt++] = i;phi[i] = i-1;}for(int j = 0; i <= n/primes[j]; j ++ ){st[i*primes[j]] = true;if(i % primes[j] == 0){phi[i*primes[j]] = phi[i] * primes[j];break;}phi[i*primes[j]] = phi[i]*(primes[j] - 1);}}
}
相关证明
(y总笔记)
欧拉函数相关应用
。(欧拉定理)
- 假如n与a互质。
- aφ(n)≡1a^{\varphi(n)}\equiv1aφ(n)≡1(mod n)
证明
- 假设1-n中,与n互质的数有x1,x2,..,xφ(n)x_1,x_2,..,x_{\varphi{(n)}}x1,x2,..,xφ(n),总共φ(n)\varphi{(n)}φ(n)个
- 那么也有a∗x1,a∗x2,..,a∗xφ(n)a*x_1,a*x_2,..,a*x_{\varphi{(n)}}a∗x1,a∗x2,..,a∗xφ(n),这φ(n)\varphi(n)φ(n)个,也与n互质。
3.由于1中也是两两不同,所以1的累乘和2的累乘同余。
即a∗x1∗a∗x2∗..∗a∗xφ(n)≡x1∗x2∗..∗xφ(n)a*x_1*a*x_2*..*a*x_{\varphi{(n)}} \equiv x_1*x_2*..*x_{\varphi{(n)}}a∗x1∗a∗x2∗..∗a∗xφ(n)≡x1∗x2∗..∗xφ(n)(mod n)
即aφ(n)∗x1∗x2∗..∗xφ(n)≡x1∗x2∗..∗xφ(n)a^{\varphi(n)}*x_1*x_2*..*x_{\varphi{(n)}} \equiv x_1*x_2*..*x_{\varphi{(n)}}aφ(n)∗x1∗x2∗..∗xφ(n)≡x1∗x2∗..∗xφ(n)(mod n)
即证aφ(n)≡1a^{\varphi(n)}\equiv1aφ(n)≡1(mod n)
费马
小定理
- 假如n与a互质。
- aφ(n)≡1a^{\varphi(n)}\equiv1aφ(n)≡1(mod n)
- 这里n为质数时,那么an−1≡1a^{n-1}\equiv1an−1≡1(mod n)
对于3)更加一般地:ax≡axmodn−1(modn)a^x\equiv a^{x \mod n-1}(mod n)ax≡axmodn−1(modn)
费马
小定理的应用,求逆元
对于b∗x≡1b*x\equiv1b∗x≡1(mod p)
- 假如p是质数,那么有b1∗bp−2=bp−1≡1{b}^{1} *{b}^{p-2} = {b}^{p-1} \equiv 1b1∗bp−2=bp−1≡1(mod p)
- 不存在逆元的情况,b是的倍数,怎样算左边都为0.
- kuangbin14数论Bi-shoe and Phi-shoe LightOJ - 1370
就是欧拉函数的模板。 - 紫薯eg题10-7Send a Table UVA - 10820
有点思维的运用欧拉函数。。。 - 紫薯eg题10-27Trees in a Wood. UVA - 10214
在上一题的基础上的拓展 + 暴力思想 + gcd的思想 - 紫薯eg题10-26Help Tomisu UVA - 11440
运用了欧拉函数的定义 + gcd的思想 + 思维 + 递推 - easy easy数论五·欧拉函数 HihoCoder - 1298
模板题,线性筛欧拉函数 - hard AcWing 204. 表达整数的奇怪方式
中国剩余定理的推导,难在推导。
10.6
紫薯以外数学模块
10.6.1
高斯消元(O(n3n^3n3))
- 解形如上图形式的方程组(唯一解、无穷解、无解)
- 三种初等行列变换
- 把某一行乘一个非零的数
- 交换某两行
- 把某行的若干倍加到另一行去
- 高斯消元,实际是把方程组 通过 初等行列变换,变成上三角的形式。
- 完美阶梯型--------------------------------------------------------------------------------------------------------有唯一解
- 0 = 非零 ----------------------------------------------------------------------------------------------------------------无解
- 0 = 0 ----------------------------------------------------------------------------------------------------------------无穷多组解
高斯消元的步骤
- 枚举每一列c
1)找到绝对值最大的一行。
2)将改行换到最上面
3)将该行第一个数变成1
4)将下面所有行的第c列消成0.
- 代码实现
# include <bits/stdc++.h>
using namespace std;
const int N = 110;
typedef double db;
const db eps= 1e-6;
db a[N][N];
int n;
int gauss(){int r = 1, c = 1;for(r = 1, c = 1; c <= n; c++ ){int t = r;for(int i = r; i <= n; i ++ )if(fabs(a[i][c])>fabs(a[t][c])) t = i;if(fabs(a[t][c])<eps)continue; //当前列为0.//把系数最大的换到最上面for(int j = c; j <= n+1; j++) swap(a[r][j],a[t][j]);//把系数置为1for(int j = n+1; j>= c; j --) a[r][j]/=a[r][c];//把下面所有的系数都changefor(int i = r+1; i <= n; i ++ ){if(fabs(a[i][c])>eps )for(int j = n+1; j >= c; j -- )a[i][j]-=a[r][j]*a[i][c];}r++;}if(r<=n){for(int i = r; i <=n; i ++ ){if(fabs(a[i][n+1])>eps)return 2;}return 1;}for(int i = n-1; i >= 1; i -- ){for(int j = i+1; j <= n; j++)a[i][n+1]-=a[i][j]*a[j][n+1];}return 0;
}
int main(){scanf("%d", &n);//cin>>n;for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n+1; j++ )scanf("%lf", a[i]+j);int pat = gauss();if(pat == 2)puts("No solution");else if(pat==1)puts("Infinite group solutions");else {for(int i = 1; i <= n; i ++ )printf("%.2f\n", a[i][n+1]);}return 0;
}
记得补充一道eg
10.6.2
组合数
- 递推写法(n2n^2n2)
const int N = 2100;
const int mod = 1e9+7;
int c[N][N];
void init(){for(int i = 0; i <N; i ++){for(int j =0; j <=i; j ++ ){if(!j) c[i][j] = 1;else c[i][j] = (c[i-1][j] + c[i-1][j-1])%mod;}}
}
- 预处理写法O(n) (假如求逆时,在for循环内就是 O(NlogNlog_NlogN) )
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10, mod = 1e9+7;
int fac[N], invfac[N];
int qpow(int a, int k, int p){int res = 1;while(k){if(k&1) res = (LL) res*a%mod;a = (LL)a*a%mod;k>>=1;}return res;
}
void init(){fac[0] = 1;for(int i =1; i <N; i ++)fac[i] = (LL)fac[i-1]*i%mod;invfac[N-1] = qpow(fac[N-1], mod-2, mod);for(int i = N - 2; i >=0; i --) invfac[i] = (LL)invfac[i+1]*(i+1)%mod;
}
int C(int a, int b){return (LL)fac[a]*invfac[a-b]%mod*invfac[b]%mod;
}int A(int a, int b){return (LL)C(a,b)*fac[b]%mod;
}
- Lucas (一般说法:logpN∗p∗logplog_pN*p*log_plogpN∗p∗logp,当然也可以预处理出[1,p][1,p][1,p]的逆元)
附上y总的证明(数据范围 a,b<=1018,p<=105a,b<=10^{18}, p<=10^{5}a,b<=1018,p<=105)
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int p;
int qpow(int a, int k){int res = 1;while(k){if(k&1) res = (LL)res*a%p;a = (LL)a*a%p;k>>=1;}return res;
}
int C(int a, int b){int res =1;for(int i =1, j =a; i<=b; i ++, j--){res = (LL)res*j%p;res = (LL)res*qpow(i,p-2)%p;}return res;
}
int Lucas(LL a, LL b){if(a<p&&b<p) return C(a,b);return (LL)C(a%p,b%p)*Lucas(a/p,b/p)%p;
}
- 高精度求组合数(用了阶乘的分解质因子,)
AC
# include <bits/stdc++.h>
# define sz(a) (int)a.size()
using namespace std;
const int N =5100;
vector<int> primes;
bool st[N+1];
void sieve(){st[1] = 1;for(int i = 2; i <= N; i ++){if(!st[i])primes.push_back(i);for(int j = 0; i <=N/primes[j]; j ++ ){st[i*primes[j]] = 1;if(i%primes[j]==0)break;}}
}
int getSum(int a, int p){int res = 0;while(a){res += a/p;a/=p;}return res;
}
int sum[N];//高精度乘法
vector<int> mul(vector<int>a, int p){vector<int> res;int t = 0;for(int i = 0; i <sz(a); i ++ ){t+=a[i]*p;res.push_back(t%10);t/=10;}while(t){res.push_back(t%10);t/=10;}return res;
}
int main(){int a, b;scanf("%d%d", &a, &b);sieve();for(int i = 0; i <sz(primes); i ++ ){int p = primes[i];sum[i] = getSum(a,p)-getSum(a-b,p)-getSum(b,p);}vector<int>res;res.push_back(1);for(int i = 0 ; i< sz(primes); i ++ ){for(int j = 1; j <=sum[i]; j ++ )res=mul(res,primes[i]);}for(int i = sz(res)-1; i >=0 ; i-- )cout<<res[i];return 0;
}
- 卡特兰数
ans = C2nn−C2nn−1C_{2n}^{n} - C_{2n}^{n-1}C2nn−C2nn−1 = C2nnn+1\frac{C_{2n}^{n}}{n+1}n+1C2nn.
(y总的笔记)
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod =1e9+7;
int qpow(int a, int k, int p){int res = 1;while(k){if(k&1) res=(LL)res*a%p;a=(LL)a*a%p;k>>=1;}return res;
}
int main(){int n;scanf("%d", &n);int a = 2*n, b = n;int res = 1;for(int i = a; i > a-b; i -- )res=(LL)res*i%mod;for(int i = 1; i <=b; i ++ )res= (LL)res*qpow(i,mod-2,mod)%mod;res = (LL)res*qpow(n+1,mod-2,mod)%mod;cout<<res<<endl;return 0;
}
补充一道火车进栈
紫薯第10章数学 kaungbin专题14数论基础相关推荐
- 紫薯第9章动态规划,从入门到入土, dp 它tnl(背包代码模板部分)
AcWing部分 传送门
- 第10章 Python 数字图像处理(DIP) - 图像分割 基础知识 标准差分割法
This Chapter is all about image segmentation. I still not finished whole chapter, but here try to pu ...
- 红书《题目与解读》第一章 数学 题解《ACM国际大学生程序设计竞赛题目与解读》
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 红书<题目与解读>第一章 数学 题解<ACM国际大学生程序设计竞赛题目与解读> ...
- 复现经典:《统计学习方法》第 10 章 隐马尔可夫模型
本文是李航老师的<统计学习方法>[1]一书的代码复现. 作者:黄海广[2] 备注:代码都可以在github[3]中下载. 我将陆续将代码发布在公众号"机器学习初学者", ...
- matlab中欠定方程组超定方程组_七年级下册第10章:认识二元一次方程组(1课时)...
潍坊初中数学 教师简介 主备人:孙岩,潍坊新华中学教师,山东省教师能手,潍坊名师. 主讲人:马晓菲,奎文区德润学校教师,奎文区初中数学学科带头人,奎文区立德树人标兵. 微课简介 这节课是第10章一次方 ...
- 第二章 数学运算、数组、文字处理
第二章 数学运算.数组.文字处理.md 知识要点 数学运算 数组的使用 seq tr sort uniq cut 等命令 数学运算 整数运算 常用的运算符 加法运算符:+ 减法运算符:- 乘法运算符: ...
- 《强化学习》中的第10章:基于函数逼近的同轨策略控制
前言: 本次笔记对<强化学习(第二版)>第十章进行概括性描述. 以下概括都是基于我个人的理解,可能有误,欢迎交流:piperliu@qq.com. 正文 很短的一章,是对于第九章的延续. ...
- 10、STL实用技术专题
10.STL实用技术专题 10.1STL(标准模板库)理论基础 10.1.1基本概念 #include <iostream> #include <vector> #includ ...
- 数学:确定性的丧失--第一章 数学真理的起源
发信人: paradax (秀树*冬眠中...), 信区: Philosophy 标 题: 数学:确定性的丧失(2) 发信站: 北大未名站 (2002年10月23日22:32:42 星期三), 转信 ...
最新文章
- 2021年全球十大工程成就,中国有几个? | 科技袁人
- OpenStack高可用核心架构分析
- 2020 年的第 1 个重磅彩蛋!
- Android 中的编码与解码
- 出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题
- 第15课:基于 CRF 的中文命名实体识别模型实现
- 使用Hadoop自带的例子pi计算圆周率
- 南昌地铁信息化服务器,南昌地铁传来大消息!太方便了!
- unity collider rigidbody zz
- win7下安装TensorFlow
- 数据结构之内部排序一
- c语言三级试题及答案,2013年计算机二级C语言模拟试题五及答案
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!
- 求教:.Net Framework 3.5 SP1安装失败
- 计算机等级考试二级c++2013 南开题库 答案光碟,全国计算机等级考试二级C++上机题库试卷一2013年.pdf...
- Web Client Software Factory系列(1):初识与预备知识
- 《工业控制系统信息安全防护指南》产品措施匹配表
- 关于contiki中的Ctimer和Etimer
- TinyXML 指南一
- python 异常处理 库_python捕获数据库异常处理
热门文章
- 怎么删除计算机的打印机设备,win7系统的打印机删除不掉怎么办?完美解决方法看这里!...
- Failed to push the item
- 最小生成树(MST)相关三题
- gzip压缩文件损坏的修复方法
- 顽固的计算机老师,电脑运行很慢 四招教你清除电脑系统里的那些“顽固垃圾”...
- 360网站卫士 PHP-DOS攻击脚本专杀工具使用笔记
- 佛罗里达大学计算机科学专业排名,2019年南佛罗里达大学计算机科学专业排名情况如何?...
- 我是IT小小鸟的读后感
- java 对接易宝支付完成真实网上支付
- 双电阻差分电流采样_1206 0.35R采样毫欧电阻等规格参数应用详情