目录

质数

试除法判定质数

分解质因数

筛质数(线性筛)

约数

试除法求约数

约数个数

约数之和

最大公约数

欧拉函数

求欧拉函数

筛法求欧拉函数

快速幂

求快速幂

快速幂求逆元

扩展欧几里得算法

扩展欧几里得算法

线性同余方程

中国剩余定理

高斯消元

高斯消元解异或线性方程组

求组合数

组合数 I

组合数 II

组合数 III

组合数 IV

卡特兰数

容斥原理

博弈论

Nim游戏

anti - NIM游戏

台阶-Nim游戏

集合-Nim游戏

拆分-Nim游戏


质数

试除法判定质数

模板如下:

bool is_prime(int x)
{if (x < 2) return false;for (int i = 2; i <= x / i; i ++ )if (x % i == 0)return false;return true;
}

分解质因数

模板如下:

void divide(int x)
{for(int i = 2; i <= x/i; i ++ ){if(x % i == 0){int s=0;while(x % i == 0) x /= i, s ++ ;printf("%d %d\n", i, s);}}if( x > 1 ) printf("%d %d\n", x, 1);puts("");
}

筛质数(线性筛)

线性筛例题:F. Function

例题讲解:F. Function 线性筛模板讲解

// 用每个合数的最小质因子筛去该数
void get_primes(int n)
{for(int i = 2; i <= n; i ++ ){if(!st[i]) primes[cnt++] = i;// 等同于 for(int j = 0; i * primes[j] <= n; j ++ )// i * primes[j] 为 要筛的合数for(int j = 0; primes[j] <= n/i; j ++ ){// 本次循环的作用筛去 合数primes[j] * i // 两种情况,分别保证 i*primes[j] 被其最小质因子筛去// 1、当 i % primes[j] != 0 时,primes[j] 一定小于i的任何质因子,所以,primes[j] 一定为 i*primes[j]的最小质因子时// 2、当 i % primes[j] == 0 时,primes[j] 为i的最小质因子,同时也为i*primes[j]的最小质因子st[primes[j] * i] = true; // 当prmies[j] 为 i 的最小质因子时,结束,再继续就不能保证是被最小质因子筛去if(i % primes[j] == 0) break; } }
}

约数

试除法求约数

vector<int> get_divisors(int x)
{vector<int> res; // 所有约数存于res数组中for(int i = 1; i <= x/i; i ++ ){if( x % i == 0 ) {res.push_back(i);// 判断是否重复放入res中,也可以不分青红皂白都放入,然后再unique一下if( i != x/i ) res.push_back(x/i);}}sort(res.begin(), res.end());return res;
}

约数个数

假设 数 n 可分解为:p1^a1 * p2 ^ a2 * …… * pk ^ ak(pk 为 n 的所有质数)

则 n 的约数个数为 (a1 + 1) * (a2 + 1) * …… * (ak + 1)

证明:设 n 的约数 x = p1 ^b1 * p2^b2 * …… * pk ^ bk,其中  0 <= bk  <= ak,即对于每个ak,有 1+ak 种选择,所以所有个数为所有的 ak + 1 的乘积;

int main()
{scanf("%d",&n);unordered_map<int,int> primes;while(n -- ){int x;scanf("%d",&x);for(int i = 2; i <= x/i; i ++ ){while( x % i == 0){x /= i;primes[i] ++;}}if(x > 1) primes[x] ++;}LL res = 1;for(auto p : primes) res = res*(p.second+1)%mod;cout << res << endl;return 0;
}

约数之和

假设 数 n 可分解为:p1^a1 * p2 ^ a2 * …… * pk ^ ak(pk 为 n 的所有质数)

则 n 的约数之和为 (p1^0 + p1^1 + p1^2 + …… + p1^a1) * (p2^0 + p2^1 + p2^2 + …… + p2^a2) * …… * (pk^0 + pk^1 + pk^2 + …… + pk^ak)

证明:将上式用乘法分配律展开,即为所有的约数

int main()
{int n;cin >> n;unordered_map<int,int> primes;while(n -- ){int x;scanf("%d",&x);for(int i = 2; i <= x / i; i ++ ){while(x % i == 0){x /= i;primes[i] ++;}if(x > 1) primes[x] ++;}}LL res;for(auto prime:primes){int a = prime.first, b = prime.second;LL t = 1;while(b -- ) t = (t * a + 1)%mod;res = res * t % mod;}cout << res << endl;return 0;
}

最大公约数

欧几里得算法(辗转相除法)(与 C++ 的 __gcd(a,b) 一样)

int gcd(int a, int b)
{return b?gcd(b, a%b):a;
}

欧拉函数

求欧拉函数

欧拉函数:

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);printf("%d\n", res);

筛法求欧拉函数

方法:在线性筛种,根据 primes[j] 的两种情况,更新对应的 i * primes[j] 的欧拉函数

当 i % primes[j] == 0 时,i * primes[j] 的质因数与 primes[j] 的质因数一致,只更新 N 即可,即,将 ph[i * primes[j] ] = phi[i] * primes[j]

当i % primes[j] != 0 时,i *  primes[j] 的质因数 比 primes[j] 多一个 primes[j] 本身,phi[i * primes[j] ] = phi[i] * (primes[j] - 1)/ primes[j] * primes[j]  -->  phi[i * primes] = phi[i] * (primes[j] - 1)

LL get_eulers(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; primes[j] <= n / i; j ++ ){st[primes[j] * i] = true;if(i % primes[j] == 0){phi[primes[j] * i] = phi[i] * primes[j];break;}phi[primes[j] * i] = phi[i] * (primes[j] - 1);}}for(int i = 1; i <= n; i ++ ) res += phi[i];return res;
}

快速幂

求快速幂

LL qmi(int a, int k, int p)
{LL res = 1;while( k ){if(k & 1) res = (LL)res * a % p;k >>= 1;a = (LL)a * a % p;}return res;
}

快速幂求逆元

一般即求 qmi(a, p-2, p)

逆元用到的场景:除法后模p,可转化为乘以乘法逆元后取余再模p(粗体部分再模p状态下等效)

#include <iostream>using namespace std;typedef long long LL;int n;int qmi(int a, int k, int p)
{int res = 1;while(k){// k & 1 返回二进制的最后一位的数字,if( k & 1 ) res = (LL)res*a % p;// 向右移 1 位,除去二进制的最后一位数字k >>= 1;// 算一位,a 乘 一倍a = (LL)a*a % p;}return res;
}int main()
{scanf("%d",&n);while(n -- ){int a, p;scanf("%d%d",&a,&p);int res = qmi(a, p-2, p);if(a % p) printf("%d\n",res);else puts("impossible");}return 0;
}

扩展欧几里得算法

扩展欧几里得算法

用途:证明裴蜀定理,并求出任意一组解

int exgcd(int a, int b, int &x, int &y)
{// 到达递归边界,开始回溯if(!b){// 将(a, b)的系数,更新为(a, 0)的系数,推导出x = 1, y = 0,一定成立x = 1, y = 0;return a;}int d = exgcd(b, a%b, y, x);// 将(a,b)的系数,更新为(b,a%b)的系数y -= a/b*x;return d; // 得到最大公因数
}

线性同余方程

可化简为 a*x + m*y = b

其中,当 b 为 gcd(a, m) 的倍数时(即、gcd(a, m) | b),方程有解;反之,无解;

#include <iostream>using namespace std;typedef long long LL;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);// 将(a,b)的系数,更新为(b,a%b)的系数y -= a/b*x;return d; // 得到最大公因数
}int main()
{int n;scanf("%d",&n);while(n -- ){int a, b, m, x, y;scanf("%d%d%d",&a,&b,&m);int d = exgcd(a,m,x,y);if(b % d) puts("impossible");else printf("%d\n",(LL) x * (b / d) % m );}return 0;
}

中国剩余定理

高斯消元

运用矩阵性质,变换,答案为 a[i][n]

步骤:变为行阶梯型

1、由第一列 c 开始向后枚举,找到本列的最大数的行

2、将最大行交换到为处理过的数据的第一行 r

3、将未处理数据第一行 r 除以第一个数,即、将首数据变为1

4、用本列的第一行行将下面未处理数据的本列其他数据消为0

判断,无解,无穷解,有解

若有解,倒着枚举每行的数据,a[i][n] 即为所求结果

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;const int N = 110;
const double eps = 1e-8;int n;
double a[N][N];int gauss()  // 高斯消元,答案存于a[i][n]中,( i >= 0 && i < n )
{int c, r;for (c = 0, r = 0; 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;// 将绝对值最大的行换到最顶端for(int i = c; i <= n; i ++ ) swap(a[r][i], a[t][i]);// 将当前行的首位变成1for(int i = n; i >= c; i -- )a[r][i] /= a[r][c];// 再该列上,用当前行的数将下面所有的行的数消成0for(int i = r + 1; i < n; i ++ )if(fabs(a[i][c]) > eps)for(int j = n; j >= c; j -- )a[i][j] -= a[r][j] * a[i][c];r ++ ;}if (r < n){// 无解,0x = 实数for(int i = r; i < n; i ++ )if(fabs(a[i][n]) > eps)return 2;        return 1; // 有无穷多组解}// 反推答案for(int i = n - 1; i >= 0; i -- )for(int j = i + 1; j < n; j ++ )a[i][n] -= a[i][j] * a[j][n];return 0; // 有唯一解
}int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++ )for (int j = 0; j < n + 1; j ++ )scanf("%lf", &a[i][j]);int t = gauss();if (t == 2) puts("No solution");else if (t == 1) puts("Infinite group solutions");else{for (int i = 0; i < n; i ++ ){if (fabs(a[i][n]) < eps) a[i][n] = 0;  // 去掉输出 -0.00 的情况printf("%.2lf\n", a[i][n]);}}return 0;
}

高斯消元解异或线性方程组

异或:不进位加法,和普通高斯消元类似,将 +,- 换成 ^

#include <bits/stdc++.h>using namespace std;const int N = 110;int n;
int a[N][N];int gauss()
{int r, c;for(r = c = 0; c < n; c ++ ){int t = r;for(int i = r; i < n; i ++ )if(a[i][c]){t = i;break;}if(!a[t][c]) continue;for(int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]);for(int i = r + 1; i < n; i ++ )if(a[i][c])for(int j = c; j <= n; j ++ )a[i][j] ^= a[r][j];r ++;}if(r < n) {for(int i = r; i < n; i ++ )if(a[i][n]) return 2;return 1;}for(int i = n - 1; i >= 0; i -- )for(int j = i + 1; j < n; j ++ )a[i][n] ^= a[i][j] & a[j][n];return 0;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; i ++ )for(int j = 0; j < n + 1; j ++ )scanf("%d", &a[i][j]);int t = gauss();if(t == 2) puts("No solution");else if(t == 1) puts("Multiple sets of solutions");else{for(int i = 0; i < n; i ++ )printf("%d\n", a[i][n]);}return 0;
}

求组合数

组合数 I

方法:预处理 + 递推

时间复杂度:O( n^2 )

#include <iostream>
#include <algorithm>using namespace std;const int N =  2010, 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-1] + c[i-1][j]) % mod;}}
}int main()
{init();int n;scanf("%d",&n);while( n -- ){int a, b;scanf("%d%d",&a, &b);printf("%d\n",c[a][b]);}return 0;
}

组合数 II

方法:预处理阶乘 + 求逆元

时间复杂度:O( nlogn )

#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int N = 100010, mod = 1e9+7;int 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;k >>= 1;a = (LL) a * a % p;}return res;
}int main()
{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) % mod;}int n;scanf("%d",&n);while(n -- ){int a, b;scanf("%d%d",&a,&b);int res = (LL)fact[a] * (infact[a-b] % mod) * (infact[b] % mod) % mod;printf("%d\n",res);}return 0;
}

组合数 III

理论基础:Lucas定理(卢卡斯定理)

方法:Lucas定理 + 基础组合数求法 + 逆元

时间复杂度化简为

#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;int 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)
{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);else return (LL)C(a % p, b % p) * lucas(a / p, b / p ) % p ;
}int main()
{int n;cin >> n;while(n -- ){LL a, b;cin >> a >> b >> p ;int res = lucas(a, b);cout << res << endl;}return 0;
}

组合数 IV

方法:分解质因数 + 阶乘求质因数 + 高精度乘法

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int N = 5010;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; // 注意 == 0}}
}int get(int n, int p)
{int res = 0;while(n){res += n / p;n /= p;}return res;
}vector<int> mul(vector<int> a, int b)
{vector<int> res;int t = 0;for(int i = 0; i < a.size() || t ; i ++ ){if(i < a.size()) t += a[i] * b;res.push_back(t % 10);t /= 10;}while(a.size() > 0 && a.back() == 0) a.pop_back();return res;
}int main()
{int a, b;cin >> a >> b ;get_primes(a);for(int i = 0; i < cnt; i ++ ){int p = primes[i];sum[i] = get(a, p) - get(b, p) - get(a - b, p);}vector<int> res;res.push_back(1);for(int i = 0; i < cnt; i ++ ){for(int j = 0; j < sum[i]; j ++ ){res = mul(res,primes[i]);}}for(int i = res.size() - 1; i >= 0; i -- ){printf("%d",res[i]);}puts("");return 0;}

卡特兰数

点击跳转:卡特兰数 ,

具体公式如下所示:

推导过程如下:

例题:889. 满足条件的01序列

AC代码:

#include <bits/stdc++.h> // 卡特兰数using namespace std;typedef long long LL;const int mod = 1e9+7;int qmi(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;
}int main()
{int n;cin >> n ;int a = 2 * n, b = n, 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 * qmi(i, mod - 2, mod) % mod;res = (LL)res * qmi(n+1, mod-2, mod) % mod;cout << res << endl;return 0;
}

容斥原理

点此处跳转:容斥原理

方法:容斥原理 + 位运算枚举所有状态

例题:能被整除的数

AC代码:

#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int N = 20;int n, m;
int p[N];int main()
{cin >> n >> m ;int res = 0;for(int i = 0; i < m; i ++ ) cin >> p[i];for(int i = 1; i < 1 << m; i ++ ){int t = 1, cnt = 0;for(int j = 0; j < m; j ++ ){if(i >> j & 1){cnt ++ ;if((LL)t * p[j] > n){t = -1;break;}t *= p[j];}}if( t != -1 ){if(cnt % 2) res += n / t;else res -= n / t;}}cout << res << endl;return 0;
}

博弈论

Nim游戏

例题链接:Nim游戏​​​​​​

必胜态与必败态:

先手必胜态:可以走到任意一个必败态

先手必败态:无法走到任意一个必败态

明确三点:

        1. 0 ^ 0 ^ 0 ^ …… ^ 0  = 0 (必败态)

2. a[1] ^ a[2] ^ a[3] ^ …… ^ a[n] = x != 0(必胜态)

3. a[1] ^ a[2] ^ a[3] ^ …… ^ a[n] = 0(必败态)

证明以上三点:

1. 不用证明

2.知:a[i] ^ x <= a[i], 我们可以大于 x 的 a[i] 中取走 a[i] - (a[i] ^ x) 个物品,使 a[i] -> a[i] ^ x,如此,即、a[1] ^ a[2] ^ a[3] ^ …… ^ a[n]^x = x^x = 0,另一个人再取任意物品都会使 异或值 不等于 0 ,我们再使结果为0,如此,后者所在的状态都是异或值为0的状态,所以 条件1 的必败态一定归后手

3. 取任意物品,都会破坏异或0的状态,从而使对方取后自己取时仍未异或0的状态,即必败态归先手

所以只需判断,所有的物品异或一起的值是否未0,=0 (必败态),!= 0 (必胜态)

代码如下

#include <iostream>
#include <algorithm>using namespace std;int main()
{int n;cin >> n;int res = 0;while(n -- ){int x;scanf("%d",&x);res ^= x;}if(res) puts("Yes");else puts("No");return 0;
}

anti - NIM游戏

关于 nim游戏及 anti-nim游戏的证明:Nim和anti-Nim

台阶-Nim游戏

例题链接:台阶-Nim游戏

明确三点

1. 0 ^ 0 ^ 0 ^ …… ^ 0  = 0 (必败态)

        2. a[1] ^ a[3] ^ a[5] ^ …… ^ a[2*n-1] = x != 0(必胜态)

3. a[1] ^ a[3] ^ a[5] ^ …… ^ a[2*n-1] = 0(必败态)

证明

若移动偶数项,则另一个人移动偶数项的下面一项(即前一项),是奇数项数不变,如此可知,答案于偶数项无关。

若移动奇数项,则可将必胜态于必败态互换,另一人再是必胜态必败态互换,则相当于状态没变,所以胜负再输入数据的那一刻就已经分出分晓

代码如下

#include <bits/stdc++.h>using namespace std;int main()
{int n, x, res = 0;scanf("%d", &n);for(int i = 1; i <= n; i ++ ){scanf("%d", &x);if(i % 2) res ^= x;}if(res) puts("Yes");else puts("No");return 0;
}

集合-Nim游戏

例题链接:集合-Nim游戏

mex函数与SG函数:

思路:将所有堆石子的SG函数异或起来,若为 0 则先手必败,反之先手必胜

SG(x) = x != 0,可以走到任意的小于 x 的 SG(x - t) 函数,同时保证对手只能走到 0 ,必败态。

SG(x) == 0,终点,为必败态。

令所有的石子堆异或为 0 ,即为 先手必败态

求SG函数:记忆化搜索

代码如下

#include <bits/stdc++.h>using namespace std;const int N = 110, M = 10010;int n, m;
int s[N], f[M];int sg(int x)
{if(f[x] != -1) return f[x];unordered_set<int> S;for(int i = 0; i < m; i ++ ){int sum = s[i];if(x >= sum) S.insert(sg(x - sum));}for(int i = 0; ; i ++ )if(!S.count(i))return f[x] = i;
}int main()
{scanf("%d", &m);for(int i = 0; i < m; i ++ ) scanf("%d", &s[i]);memset(f, -1, sizeof f);scanf("%d", &n);int res = 0, x;for(int i = 0; i < n; i ++ ){scanf("%d", &x);res ^= sg(x);}if(res) puts("Yes");else puts("No");return 0;
}

拆分-Nim游戏

例题链接:拆分-Nim游戏

与集合Nim相似,后继状态为最大值小于当前状态 x 的所有二元组(i,j)

即sg(x) = mex{sg(i) ^ sg(j)……};

代码如下

#include <bits/stdc++.h>using namespace std;const int N = 110;int n;
int f[N];int sg(int x)
{if(f[x] != -1) return f[x];unordered_set<int> S;for(int i = 0; i < x; i ++ )for(int j = 0; j <= i; j ++ )S.insert(sg(i) ^ sg(j));for(int i = 0; ; i ++ )if(!S.count(i))return f[x] = i;
}int main()
{scanf("%d", &n);memset(f, -1, sizeof f);int res = 0, x;for(int i = 0; i < n; i ++ ){scanf("%d", &x);res ^= sg(x);}if(res) puts("Yes");else puts("No");return 0;
}

数学知识(基础数论)相关推荐

  1. 算法基础入门——数论(数学知识基础)

    文章目录 一.质数 分解质因数 题目 代码 筛选质数 埃氏筛法 题目 代码 线性筛法 二.约数 约数个数 试除法求约数个数(时间复杂度:O(sqrt(N)) ) 未完待续 一.质数 质数即因子只有1和 ...

  2. 程序员需要学习太多数学知识吗?

    如果你想当一个顶级程序员,梦想着改变世界,那么数学对你来说就很重要了." 数学对我们每一个程序员来说,都是最熟悉的陌生人.你从小就开始学习数学,那些熟悉的数学定理和公式陪伴你走过好多年.但是 ...

  3. RSA算法原理——(2)RSA简介及基础数论知识

    上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...

  4. AcWing基础算法课Level-2 第四讲 数学知识

    AcWing基础算法课Level-2 第四讲 数学知识 您将学会以下数学名词 质数,试除法,埃式筛法,线性筛,辗转相除,算术基本定理,质因数分解,欧拉函数,快速幂,费马小定理,逆元,拓展欧几里得,一次 ...

  5. 数学/基础数论——从LeetCode题海中总结常见套路

    今天是大年初一,祝大家新年快乐! 目录 基础数论求质数:LeetCode204.计数质数 常规解法: 娱乐一下:偷鸡式解法 埃拉托色尼筛选法 统计5因子的个数:LeetCode172.阶乘后的零 暴力 ...

  6. 算法之基础数论应用篇(一)

    基础数论应用篇 子集和 题目描述 筛质数 筛质数模板 欧拉筛 线性筛 哥德巴赫猜想 夏洛克和他的女朋友 二次筛法 分解质因数 试除法分解质因数 分解阶乘质因子 快速幂 模板 快速幂 快速乘法 序列的第 ...

  7. 具体数学:计算机科学基础:第2版

    <具体数学:计算机科学基础:第2版> 基本信息 原书名:Concrete mathematics:A foundation for computer science,second edit ...

  8. Acwing - 算法基础课 - 笔记(数学知识 · 二)

    文章目录 数学知识(二) 欧拉函数 公式法 筛法 欧拉定理 快速幂 扩展欧几里得算法 中国剩余定理 数学知识(二) 这一小节主要讲解的内容是:欧拉函数,快速幂,扩展欧几里得算法,中国剩余定理. 这一节 ...

  9. 一位MIT计算机博士对数学知识的思考

    在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进.为什么要深入数学的世界?作为计算机的学生,我没有任何企图要成为一个数学家.我学习数学的目的,是要 ...

  10. 强烈推荐 | 豆瓣评分高达9.0的数学纪录片,从历史的角度给孩子科普数学知识...

    在豆瓣上的评分高达9.0的 BBC 纪录片"数学的故事(The Story of Maths)"是小编非常喜欢的一部纪录片:脉络清晰,逻辑清楚,深入浅出,从历史的角度给孩子科普数学 ...

最新文章

  1. Spring Boot Profile使用详解及配置源码解析
  2. JS中showModalDialog详细使用
  3. go编译库给c语言函数返回值,go语言 函数return值的几种情况
  4. Java讲课笔记28:Path接口和Files工具类
  5. 美的集团:董事长减持两千万股套现13亿属个人资产配置需要
  6. 在MOSS2007中使用网页获取部件
  7. 支付宝玉伯:我心目中的优秀API
  8. 图像增强之直方图均衡化
  9. Cholesky分解及一个例子
  10. 广州市二手房源数据采集和可视化分析(链家二手房)Python
  11. 蜗牛星际b款装服务器系统,蜗牛星际B款单网口折腾
  12. JAVA - 手机扫描二维码,页面响应(不是扫码登录)
  13. vagex挂机php,免费Docker容器来挂机Vagex赚美刀
  14. android 图片字体涂鸦,Android 编辑图片 Canvas画图,涂鸦,马赛克等(一)
  15. SAP中由于“己结算申请”未勾选原因导致无法查询到采购申请
  16. Google VP8 Code 首次深入技术分析 1
  17. Codeforces Round #700 (Div. 2)全部题解
  18. 单片机秒表c语言程序设计思路,单片机秒表程序设计
  19. css3 nth child 偶数,转载:CSS3 :nth-child(n)方法
  20. 第九课 Java基础篇——面向对象(综合案例)

热门文章

  1. 锂热电池检测设备 你一定没见过这种检测方式!
  2. 心理测试软件需求分析报告,心理测评软件都适用于哪些人群?具体有哪些功能?【心悦灵】...
  3. 【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
  4. 音视频开发(二十七):基于FFmpeg实现简单的视频解码器
  5. HTML利用当前网页地址生成二维码
  6. 国际多式联运数字化解决方案
  7. dorado7.x UploadAction存在的诡异问题
  8. R语言|文本挖掘应用|标签云
  9. 淘宝接口开发流程以及遇到的坑总结
  10. 天书笔记(1)---逆向C基础