日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

D2下午

發布時間:2025/7/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 D2下午 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

至于為什么D2要分上下午,唯一的原因就是lyd那個毒瘤用了一上午講他昨天要講的鬼畜東西,所以今天下午才開始講數論了

對了,補一下lyd的數論人

《數論人》(大霧) 數論的光束是歌德巴赫 那是誰?是誰?是誰? 將數論之力 集于一身 那是數論 數論人 數論人 正義的英雄 背負著純粹數學之名 數論人 數論人 舍棄了一切(指實際生產)去戰斗的男人 數論之箭是費馬大定理 數論之耳是四色定理 數論之翼是黎曼猜想

開始吧

各種各樣的高精

這個魔鬼上來就講高精度

因為都學會了,就直接看當年的博客吧(惆悵

快速冪

這個其實是基于倍增思想?(反正很多東西都是相通的

其實就是/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

以斐波拉期數列為例:M = ((1 1) (1 0))

以此類推:

[F(0) F(1)]T * Mn = [F(n) F(n+1)]T

我們成功將一個遞推式轉化成了一個求矩陣冪的問題

利用快速冪算法可以將時間縮短為 O(d^3 logn)

利用 FFT + 矩陣特征多項式的黑科技可以把時間進一步縮短到 O(dlogdlogn)

我們來試著寫一下下面的矩陣:

F(n) = 7F(n-1) + 6F(n-2) + 5n + 4 * 3^n

先考慮轉換前后的兩個矩陣,肯定要有所有在轉換中需要的

我們發現如果要從f[n-1]轉換到f[n],要用到f[n-1],f[n-2],n,3^n,我們就先寫上這些

然后發現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

高斯消元

這個東西和行列式求值也比較像,其實就是用矩陣運算吧
這是曾經的一個代碼

#include <iostream> #include <string> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; double n, a[20][20], ans = 1; int sum; inline void CH1(int x, int y, double k) //第y行減k*x {for (int i = 1; i <= n; ++i)a[y][i] -= (double)(k * a[x][i]); } inline void CH2(int x, int y) //交換x列和y列 {for (int i = 1; i <= n; ++i)swap(a[i][x], a[i][y]); } inline double CH3(int x, double k) //把第x行提出一個公因數k {for (int i = 1; i <= n; ++i)a[x][i] /= k;return k; } int main() {scanf("%lf", &n);for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)scanf("%lf", &a[i][j]);for (int i = 1; i < n; ++i){ sum=i;while (a[i][i] == 0 && sum<=n) //對是否a[i][i]是0的特判{CH2(i, sum + 1); //交換x列和y列ans *= -1;sum++;}ans *= CH3(i, a[i][i]);for (int j = i + 1; j <= n; ++j)CH1(i, j, a[j][i]);}for (int i = 1; i <= n; ++i)ans *= a[i][i];printf("%0.0lf", ans);return 0; }

這個是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) //循環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; }

數論好惡心

篩法

篩法的話一般就是埃拉托色尼篩或者是歐拉篩(線性篩)

埃拉托色尼篩

思想就是所有質數的倍數都被篩掉

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;}}

歐拉篩(線性篩)


保證了所有的數只被最小的質因數篩掉

歐拉篩還可以用來維護一些復雜的函數值
如:逆元、一個數的質因數分解中最大的指數的值

積性函數

積性函數:對于所有互質的 x 和 y,F(x * y) = F(x) * F(y)

完全積性函數:對于所有 x 和 y ,F(x * y) = F(x) * F(y)

常見的積性函數:
歐拉函數 φ(n) :不超過 n 與 n 互素的數的個數

若則

轉載于:https://www.cnblogs.com/this-is-M/p/11201085.html

總結

以上是生活随笔為你收集整理的D2下午的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。