最全来自北京大学NOIP金牌选手yxc的常用代码模板4——数学知识,当上项目经理才知道

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

image.png

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

if (st[i]) continue;

primes[cnt ++ ] = i;

for (int j = i + i; j <= n; j += i)

st[j] = true;

}

}

4.线性筛法求素数

int primes[N], cnt; // primes[]存储所有素数

bool st[N]; // st[x]存储x是否被筛掉

void get_primes(int n)

{

for (int i = 2; i <= n; i ++ )

{

if (!st[i]) primes[cnt ++ ] = i;

for (int j = 0; primes[j] <= n / i; j ++ )

{

st[primes[j] * i] = true;

if (i % primes[j] == 0) break;

}

}

}

5.试除法求所有约数

vector get_divisors(int x)

{

vector res;

for (int i = 1; i <= x / i; i ++ )

if (x % i == 0)

{

res.push_back(i);

if (i != x / i) res.push_back(x / i);

}

sort(res.begin(), res.end());

return res;

}

6.约数个数和约数之和

如果 N = p1^c1 * p2^c2 * ... *pk^ck

约数个数:(c1 + 1) * (c2 + 1) * ... * (ck + 1)

约数之和: (p1^0 + p1^1 + ... + p1^c1) * ... * (pk^0 + pk^1 + ... + pk^ck)

7.欧几里得算法

int gcd(int a, int b)

{

return b ? gcd(b, a % b) : a;

}

求欧拉函数 —— 模板题 AcWing 873. 欧拉函数

int phi(int x)

{

int res = x;

for (int i = 2; i <= x / i; i ++ )

if (x % i == 0)

{

res = res / i * (i - 1);

while (x % i == 0) x /= i;

}

if (x > 1) res = res / x * (x - 1);

return res;

}

8.筛法求欧拉函数

int primes[N], cnt; // primes[]存储所有素数

int euler[N]; // 存储每个数的欧拉函数

bool st[N]; // st[x]存储x是否被筛掉

void get_eulers(int n)

{

euler[1] = 1;

for (int i = 2; i <= n; i ++ )

{

if (!st[i])

{

primes[cnt ++ ] = i;

euler[i] = i - 1;

}

for (int j = 0; primes[j] <= n / i; j ++ )

{

int t = primes[j] * i;

st[t] = true;

if (i % primes[j] == 0)

{

euler[t] = euler[i] * primes[j];

break;

}

euler[t] = euler[i] * (primes[j] - 1);

}

}

}

9.快速幂

m^k mod p,时间复杂度O(logk)

int qmi(int m, int k, int p)

{

int res = 1 % p, t = m;

while (k)

{

if (k&1) res = res * t % p;

t = t * t % p;

k >>= 1;

}

return res;

}

10.扩展欧几里得算法

// 求x, y,使得ax + by = gcd(a, b)

int exgcd(int a, int b, int &x, int &y)

{

if (!b)

{

x = 1; y = 0;

return a;

}

int d = exgcd(b, a % b, y, x);

y -= (a/b) * x;

return d;

}

11.高斯消元

递归法求组合数

// c[a][b] 表示从a个苹果中选b个的方案数

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;

通过预处理逆元的方式求组合数

首先预处理出所有阶乘取模的余数fact[N],以及所有阶乘取模的逆元infact[N]

如果取模的数是质数,可以用费马小定理求逆元

int qmi(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;

}

// 预处理阶乘的余数和阶乘逆元的余数

fact[0] = infact[0] = 1;

for (int i = 1; i < N; i ++ )

{

fact[i] = (LL)fact[i - 1] * i % mod;

infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2, mod) % mod;

}

12.Lucas定理

p是质数,则对于任意整数 1 <= m <= n,有:

C(n, m) = C(n % p, m % p) * C(n / p, m / p) (mod p)

int qmi(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) // 通过定理求组合数C(a, b)

{

int res = 1;

for (int i = 1, j = a; i <= b; i ++, j – )

{

res = (LL)res * j % p;

res = (LL)res * qmi(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;

}

13.分解质因数法求组合数

当我们需要求出组合数的真实值,而非对某个数的余数时,分解质因数的方式比较好用:

1. 筛法求出范围内的所有质数

2. 通过C(a, b) = a! / b! / (a - b)! 这个公式求出每个质因子的次数。 n!p的次数是n / p + n / p^2 + n / p^3 + ...

3. 用高精度乘法将所有质因子相乘

int primes[N], cnt; // 存储所有质数

int sum[N]; // 存储每个质数的次数

bool st[N]; // 存储每个数是否已被筛掉

void get_primes(int n) // 线性筛法求素数

{

for (int i = 2; i <= n; i ++ )

{

if (!st[i]) primes[cnt ++ ] = i;

for (int j = 0; primes[j] <= n / i; j ++ )

{

st[primes[j] * i] = true;

if (i % primes[j] == 0) break;

}

}

}

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

[外链图片转存中…(img-kPQIc0ja-1715606994571)]

[外链图片转存中…(img-mJGTnTng-1715606994571)]

[外链图片转存中…(img-ZZnUFtGE-1715606994571)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值