D2下午
前言
至于為什么D2要分上下午,唯一的原因就是lyd那個毒瘤用了一上午講他昨天要講的鬼畜東西,所以今天下午才開始講數(shù)論了
對了,補(bǔ)一下lyd的數(shù)論人
《數(shù)論人》(大霧) 數(shù)論的光束是歌德巴赫 那是誰?是誰?是誰? 將數(shù)論之力 集于一身 那是數(shù)論 數(shù)論人 數(shù)論人 正義的英雄 背負(fù)著純粹數(shù)學(xué)之名 數(shù)論人 數(shù)論人 舍棄了一切(指實際生產(chǎn))去戰(zhàn)斗的男人 數(shù)論之箭是費(fèi)馬大定理 數(shù)論之耳是四色定理 數(shù)論之翼是黎曼猜想開始吧
各種各樣的高精
這個魔鬼上來就講高精度
因為都學(xué)會了,就直接看當(dāng)年的博客吧(惆悵
快速冪
這個其實是基于倍增思想?(反正很多東西都是相通的
其實就是/2下取整等等操作,代碼如下
int power(int a, int p) {long long res = 1;while (p){if (p & 1)res = res * a;a = a * a;p >>= 1;}return res; }矩陣乘法
一個i行k列的矩陣乘上一個k行j列的矩陣會變成i行j列的矩陣
答案矩陣的第i,j個元素為A矩陣第i行第k個元素乘B矩陣第k行第j個元素,k是從1到m,就是一個矩陣的行乘另一個矩陣的列
上一下代碼
for (int i = 1;i <= n; ++i)for (int k = 1;k <= m; ++k)for (int j = 1;j <= r;++j)c[i][j] + a[i][k] * b[k][j];矩陣乘法常常用于求一些線性的遞歸方程組,可以起到非常牛逼的加速作用
比如斐波那契的矩陣就是
1 1 1 0 [f[n], f[n - 1] ] * [矩陣] ^ k = [f[n + k], [n + k - 1] ]矩陣快速冪基于以下的原理,即可以找到一個矩陣 M使得
[F(n-1) F(n)]T * M = [F(n) F(n+1)] T
以斐波拉期數(shù)列為例:M = ((1 1) (1 0))
以此類推:
[F(0) F(1)]T * Mn = [F(n) F(n+1)]T
我們成功將一個遞推式轉(zhuǎn)化成了一個求矩陣冪的問題
利用快速冪算法可以將時間縮短為 O(d^3 logn)
利用 FFT + 矩陣特征多項式的黑科技可以把時間進(jìn)一步縮短到 O(dlogdlogn)
我們來試著寫一下下面的矩陣:
F(n) = 7F(n-1) + 6F(n-2) + 5n + 4 * 3^n
先考慮轉(zhuǎn)換前后的兩個矩陣,肯定要有所有在轉(zhuǎn)換中需要的
我們發(fā)現(xiàn)如果要從f[n-1]轉(zhuǎn)換到f[n],要用到f[n-1],f[n-2],n,3^n,我們就先寫上這些
然后發(fā)現(xiàn)n要轉(zhuǎn)換到n+1就需要個1,再加上1就好了
[f[n - 1], f[n - 2], n, 3 ^ n, 1]
[f[n], f[n - 1], n + 1, 3 ^ (n + 1) ,1]
然后按照遞推式搞一搞就ok
高斯消元
這個東西和行列式求值也比較像,其實就是用矩陣運(yùn)算吧
這是曾經(jīng)的一個代碼
這個是lh神仙的高斯消元
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pr; const double pi = acos(-1); #define rep(i, a, n) for (int i = a; i <= n; i++) #define per(i, n, a) for (int i = n; i >= a; i--) #define Rep(i, u) for (int i = head[u]; i; i = Next[i]) #define clr(a) memset(a, 0, sizeof a) #define pb push_back #define mp make_pair #define fi first #define sc second ld eps = 1e-9; ll pp = 1000000007; ll mo(ll a, ll pp) {if (a >= 0 && a < pp)return a;a %= pp;if (a < 0)a += pp;return a; } ll powmod(ll a, ll b, ll pp) {ll ans = 1;for (; b; b >>= 1, a = mo(a * a, pp))if (b & 1)ans = mo(ans * a, pp);return ans; } ll read() {ll ans = 0;char last = ' ', ch = getchar();while (ch < '0' || ch > '9')last = ch, ch = getchar();while (ch >= '0' && ch <= '9')ans = ans * 10 + ch - '0', ch = getchar();if (last == '-')ans = -ans;return ans; } //head int n, m; double a[100][100];bool check(int k) {if (fabs(a[k][n + 1]) < eps)return 1;rep(i, 1, n) if (fabs(a[k][i]) > eps) return 1;return 0; } int main() {n = read();m = n;rep(i, 1, m)rep(j, 1, n + 1) a[i][j] = read();int flag = 0;rep(i, 1, n){int t = i;while (a[t][i] == 0 && t <= n)t += 1;if (t == n + 1){flag = 1;continue;}rep(j, 1, n + 1) swap(a[i][j], a[t][j]); //交換兩行double kk = a[i][i]; //每一行對角線上的值rep(j, 1, n + 1) a[i][j] /= kk;rep(j, 1, m) //循環(huán)m個式子 開始消元if (i != j){double kk = a[j][i];rep(k, 1, n + 1)a[j][k] -= kk * a[i][k];}}if (flag){return printf("No Solution\n"), 0;}rep(j, 1, m){printf("%.2lf", a[j][n + 1] / a[j][j]);puts("");}return 0; }數(shù)論好惡心
篩法
篩法的話一般就是埃拉托色尼篩或者是歐拉篩(線性篩)
埃拉托色尼篩
思想就是所有質(zhì)數(shù)的倍數(shù)都被篩掉
memset(b, false, sizeof(b));int tot = 0;for (int i = 2; i <= n; ++i){if (!b[i]){prime[++tot] = i;for (int j = i * 2; j <= n; j += i)b[j] = true;}}歐拉篩(線性篩)
保證了所有的數(shù)只被最小的質(zhì)因數(shù)篩掉
歐拉篩還可以用來維護(hù)一些復(fù)雜的函數(shù)值
如:逆元、一個數(shù)的質(zhì)因數(shù)分解中最大的指數(shù)的值
積性函數(shù)
積性函數(shù):對于所有互質(zhì)的 x 和 y,F(x * y) = F(x) * F(y)
完全積性函數(shù):對于所有 x 和 y ,F(x * y) = F(x) * F(y)
常見的積性函數(shù):
歐拉函數(shù) φ(n) :不超過 n 與 n 互素的數(shù)的個數(shù)
若則
轉(zhuǎn)載于:https://www.cnblogs.com/this-is-M/p/11201085.html
總結(jié)
- 上一篇: SSO2.0
- 下一篇: 偷懒的inline-block解决方法