杂谈

  • 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=p1​a1​p2​a2​p3​a3​...pn​an​
约数个数
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=(p1​0+p1​1+...p1​a1​)(p2​0+p2​1+p2​a2​)...(pn​0+pn​1+pn​an​)

  1. int内最多的约数个数为1536
  2. 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只会被最小质因子筛掉。

  1. iii % pj==0p_j == 0pj​==0
    pjp_jpj​一定是iii的最小质因子,pjp_jpj​一定是pj∗ip_j*ipj​∗i的最小质因子。
  2. iii % pj!=0p_j != 0pj​!=0
    pjp_jpj​一定小于iii的所有质因子,pjp_jpj​也一定是pj∗ip_j*ipj​∗i的最小质因子。
  3. 对于一个合数x,假设pjp_jpj​是x的最小质因子,当iii枚举到x/pjx/p_jx/pj​的时候,一定被筛掉。

快速幂(logk)

分析

  1. aka^kak
  2. 可以拆成,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​
  3. 之后再看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)

  1. d∣ad|ad∣a 和d∣bd|bd∣b 那么 d∣a+bd|a+bd∣a+b,那么d∣ax+byd|ax+byd∣ax+by
  2. 即对于a%b = a−⌊ab⌋∗ba-\lfloor \frac{a}{b}\rfloor * ba−⌊ba​⌋∗b
  3. 另c=⌊ab⌋c = \lfloor \frac{a}{b}\rfloorc=⌊ba​⌋,那么a%b=a-c*b;
  4. 即证明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

  1. a mod b = a−⌊ab⌋∗ba-\lfloor \frac{a}{b} \rfloor *ba−⌊ba​⌋∗b
  2. 对于ax+by=(a,b),可得by + (a−⌊ab⌋∗ba-\lfloor \frac{a}{b} \rfloor *ba−⌊ba​⌋∗b)x = (a,b)
  3. 那么整理得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地一点体会(下面有一道中国剩余定理的不互质版本,可以结合使用)

  1. 首先对于一个方程组,exgcd求完后,相当于求出了m1在模m2下的逆元
  2. 对于一个求完的解,根据上式子说明只是 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
    唯一分解&&LCM

  • kuangbin14数论Leading and Trailing LightOJ - 1282
    快速幂 + 数学log

  • kuangbin14数论[Goldbachs 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总笔记)



欧拉函数相关应用。(欧拉定理)

  1. 假如n与a互质。
  2. aφ(n)≡1a^{\varphi(n)}\equiv1aφ(n)≡1(mod n)

证明

  1. 假设1-n中,与n互质的数有x1,x2,..,xφ(n)x_1,x_2,..,x_{\varphi{(n)}}x1​,x2​,..,xφ(n)​,总共φ(n)\varphi{(n)}φ(n)个
  2. 那么也有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)

费马小定理

  1. 假如n与a互质。
  2. aφ(n)≡1a^{\varphi(n)}\equiv1aφ(n)≡1(mod n)
  3. 这里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)

  1. 假如p是质数,那么有b1∗bp−2=bp−1≡1{b}^{1} *{b}^{p-2} = {b}^{p-1} \equiv 1b1∗bp−2=bp−1≡1(mod p)
  2. 不存在逆元的情况,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))

  1. 解形如上图形式的方程组(唯一解、无穷解、无解)
  2. 三种初等行列变换
  1. 把某一行乘一个非零的数
  2. 交换某两行
  3. 把某行的若干倍加到另一行去
  1. 高斯消元,实际是把方程组 通过 初等行列变换,变成上三角的形式。
  1. 完美阶梯型--------------------------------------------------------------------------------------------------------有唯一解
  2. 0 = 非零 ----------------------------------------------------------------------------------------------------------------无解
  3. 0 = 0 ----------------------------------------------------------------------------------------------------------------无穷多组解
  1. 高斯消元的步骤
  1. 枚举每一列c
    1)找到绝对值最大的一行。
    2)将改行换到最上面
    3)将该行第一个数变成1
    4)将下面所有行的第c列消成0.
  1. 代码实现
# 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 组合数

  1. 递推写法(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;}}
}
  1. 预处理写法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;
}
  1. Lucas (一般说法:logpN∗p∗logplog_pN*p*log_plogp​N∗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;
}
  1. 高精度求组合数(用了阶乘的分解质因子,)

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;
}
  1. 卡特兰数
    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数论基础相关推荐

  1. 紫薯第9章动态规划,从入门到入土, dp 它tnl(背包代码模板部分)

    AcWing部分 传送门

  2. 第10章 Python 数字图像处理(DIP) - 图像分割 基础知识 标准差分割法

    This Chapter is all about image segmentation. I still not finished whole chapter, but here try to pu ...

  3. 红书《题目与解读》第一章 数学 题解《ACM国际大学生程序设计竞赛题目与解读》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 红书<题目与解读>第一章 数学 题解<ACM国际大学生程序设计竞赛题目与解读> ...

  4. 复现经典:《统计学习方法》第 10 章 隐马尔可夫模型

    本文是李航老师的<统计学习方法>[1]一书的代码复现. 作者:黄海广[2] 备注:代码都可以在github[3]中下载. 我将陆续将代码发布在公众号"机器学习初学者", ...

  5. matlab中欠定方程组超定方程组_七年级下册第10章:认识二元一次方程组(1课时)...

    潍坊初中数学 教师简介 主备人:孙岩,潍坊新华中学教师,山东省教师能手,潍坊名师. 主讲人:马晓菲,奎文区德润学校教师,奎文区初中数学学科带头人,奎文区立德树人标兵. 微课简介 这节课是第10章一次方 ...

  6. 第二章 数学运算、数组、文字处理

    第二章 数学运算.数组.文字处理.md 知识要点 数学运算 数组的使用 seq tr sort uniq cut 等命令 数学运算 整数运算 常用的运算符 加法运算符:+ 减法运算符:- 乘法运算符: ...

  7. 《强化学习》中的第10章:基于函数逼近的同轨策略控制

    前言: 本次笔记对<强化学习(第二版)>第十章进行概括性描述. 以下概括都是基于我个人的理解,可能有误,欢迎交流:piperliu@qq.com. 正文 很短的一章,是对于第九章的延续. ...

  8. 10、STL实用技术专题

    10.STL实用技术专题 10.1STL(标准模板库)理论基础 10.1.1基本概念 #include <iostream> #include <vector> #includ ...

  9. 数学:确定性的丧失--第一章 数学真理的起源

    发信人: paradax (秀树*冬眠中...), 信区: Philosophy 标  题: 数学:确定性的丧失(2) 发信站: 北大未名站 (2002年10月23日22:32:42 星期三), 转信 ...

最新文章

  1. 2021年全球十大工程成就,中国有几个? | 科技袁人
  2. OpenStack高可用核心架构分析
  3. 2020 年的第 1 个重磅彩蛋!
  4. Android 中的编码与解码
  5. 出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题
  6. 第15课:基于 CRF 的中文命名实体识别模型实现
  7. 使用Hadoop自带的例子pi计算圆周率
  8. 南昌地铁信息化服务器,南昌地铁传来大消息!太方便了!
  9. unity collider rigidbody zz
  10. win7下安装TensorFlow
  11. 数据结构之内部排序一
  12. c语言三级试题及答案,2013年计算机二级C语言模拟试题五及答案
  13. 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!
  14. 求教:.Net Framework 3.5 SP1安装失败
  15. 计算机等级考试二级c++2013 南开题库 答案光碟,全国计算机等级考试二级C++上机题库试卷一2013年.pdf...
  16. Web Client Software Factory系列(1):初识与预备知识
  17. 《工业控制系统信息安全防护指南》产品措施匹配表
  18. 关于contiki中的Ctimer和Etimer
  19. TinyXML 指南一
  20. python 异常处理 库_python捕获数据库异常处理

热门文章

  1. 怎么删除计算机的打印机设备,win7系统的打印机删除不掉怎么办?完美解决方法看这里!...
  2. Failed to push the item
  3. 最小生成树(MST)相关三题
  4. gzip压缩文件损坏的修复方法
  5. 顽固的计算机老师,电脑运行很慢 四招教你清除电脑系统里的那些“顽固垃圾”...
  6. 360网站卫士 PHP-DOS攻击脚本专杀工具使用笔记
  7. 佛罗里达大学计算机科学专业排名,2019年南佛罗里达大学计算机科学专业排名情况如何?...
  8. 我是IT小小鸟的读后感
  9. java 对接易宝支付完成真实网上支付
  10. 双电阻差分电流采样_1206 0.35R采样毫欧电阻等规格参数应用详情