数学知识(基础数论)
目录
质数
试除法判定质数
分解质因数
筛质数(线性筛)
约数
试除法求约数
约数个数
约数之和
最大公约数
欧拉函数
求欧拉函数
筛法求欧拉函数
快速幂
求快速幂
快速幂求逆元
扩展欧几里得算法
扩展欧几里得算法
线性同余方程
中国剩余定理
高斯消元
高斯消元解异或线性方程组
求组合数
组合数 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;
}
数学知识(基础数论)相关推荐
- 算法基础入门——数论(数学知识基础)
文章目录 一.质数 分解质因数 题目 代码 筛选质数 埃氏筛法 题目 代码 线性筛法 二.约数 约数个数 试除法求约数个数(时间复杂度:O(sqrt(N)) ) 未完待续 一.质数 质数即因子只有1和 ...
- 程序员需要学习太多数学知识吗?
如果你想当一个顶级程序员,梦想着改变世界,那么数学对你来说就很重要了." 数学对我们每一个程序员来说,都是最熟悉的陌生人.你从小就开始学习数学,那些熟悉的数学定理和公式陪伴你走过好多年.但是 ...
- RSA算法原理——(2)RSA简介及基础数论知识
上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...
- AcWing基础算法课Level-2 第四讲 数学知识
AcWing基础算法课Level-2 第四讲 数学知识 您将学会以下数学名词 质数,试除法,埃式筛法,线性筛,辗转相除,算术基本定理,质因数分解,欧拉函数,快速幂,费马小定理,逆元,拓展欧几里得,一次 ...
- 数学/基础数论——从LeetCode题海中总结常见套路
今天是大年初一,祝大家新年快乐! 目录 基础数论求质数:LeetCode204.计数质数 常规解法: 娱乐一下:偷鸡式解法 埃拉托色尼筛选法 统计5因子的个数:LeetCode172.阶乘后的零 暴力 ...
- 算法之基础数论应用篇(一)
基础数论应用篇 子集和 题目描述 筛质数 筛质数模板 欧拉筛 线性筛 哥德巴赫猜想 夏洛克和他的女朋友 二次筛法 分解质因数 试除法分解质因数 分解阶乘质因子 快速幂 模板 快速幂 快速乘法 序列的第 ...
- 具体数学:计算机科学基础:第2版
<具体数学:计算机科学基础:第2版> 基本信息 原书名:Concrete mathematics:A foundation for computer science,second edit ...
- Acwing - 算法基础课 - 笔记(数学知识 · 二)
文章目录 数学知识(二) 欧拉函数 公式法 筛法 欧拉定理 快速幂 扩展欧几里得算法 中国剩余定理 数学知识(二) 这一小节主要讲解的内容是:欧拉函数,快速幂,扩展欧几里得算法,中国剩余定理. 这一节 ...
- 一位MIT计算机博士对数学知识的思考
在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进.为什么要深入数学的世界?作为计算机的学生,我没有任何企图要成为一个数学家.我学习数学的目的,是要 ...
- 强烈推荐 | 豆瓣评分高达9.0的数学纪录片,从历史的角度给孩子科普数学知识...
在豆瓣上的评分高达9.0的 BBC 纪录片"数学的故事(The Story of Maths)"是小编非常喜欢的一部纪录片:脉络清晰,逻辑清楚,深入浅出,从历史的角度给孩子科普数学 ...
最新文章
- Spring Boot Profile使用详解及配置源码解析
- JS中showModalDialog详细使用
- go编译库给c语言函数返回值,go语言 函数return值的几种情况
- Java讲课笔记28:Path接口和Files工具类
- 美的集团:董事长减持两千万股套现13亿属个人资产配置需要
- 在MOSS2007中使用网页获取部件
- 支付宝玉伯:我心目中的优秀API
- 图像增强之直方图均衡化
- Cholesky分解及一个例子
- 广州市二手房源数据采集和可视化分析(链家二手房)Python
- 蜗牛星际b款装服务器系统,蜗牛星际B款单网口折腾
- JAVA - 手机扫描二维码,页面响应(不是扫码登录)
- vagex挂机php,免费Docker容器来挂机Vagex赚美刀
- android 图片字体涂鸦,Android 编辑图片 Canvas画图,涂鸦,马赛克等(一)
- SAP中由于“己结算申请”未勾选原因导致无法查询到采购申请
- Google VP8 Code 首次深入技术分析 1
- Codeforces Round #700 (Div. 2)全部题解
- 单片机秒表c语言程序设计思路,单片机秒表程序设计
- css3 nth child 偶数,转载:CSS3 :nth-child(n)方法
- 第九课 Java基础篇——面向对象(综合案例)
热门文章
- 锂热电池检测设备 你一定没见过这种检测方式!
- 心理测试软件需求分析报告,心理测评软件都适用于哪些人群?具体有哪些功能?【心悦灵】...
- 【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
- 音视频开发(二十七):基于FFmpeg实现简单的视频解码器
- HTML利用当前网页地址生成二维码
- 国际多式联运数字化解决方案
- dorado7.x UploadAction存在的诡异问题
- R语言|文本挖掘应用|标签云
- 淘宝接口开发流程以及遇到的坑总结
- 天书笔记(1)---逆向C基础